2

MVC 4 プロジェクトがあり、SiteMapProvider v4.0.17 にアップグレードしたばかりです。アップグレード以来、編集フォームの変更のポストバックでエラーが発生しています。メニュー自体は期待どおりに機能し、プロジェクトでは他に何も変更されていません。エラーは次のとおりです: -

IControllerFactory 'MvcSiteMapProvider.DI.ControllerFactoryDe​​corator' は、'Scripts' という名前のコントローラーを返しませんでした

プロジェクト内の唯一の「スクリプト」は、.js ファイルを含むフォルダーであるため、どこから調べればよいかわかりません。例外は次の場所で発生します: -

>   System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.ProcessRequestInit(System.Web.HttpContextBase httpContext, out System.Web.Mvc.IController controller, out System.Web.Mvc.IControllerFactory factory) + 0x159 bytes 
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.BeginProcessRequest(System.Web.HttpContextBase httpContext, System.AsyncCallback callback, object state) + 0x32 bytes  
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.BeginProcessRequest(System.Web.HttpContext httpContext, System.AsyncCallback callback, object state) + 0x33 bytes  
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData) + 0x11 bytes   
System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x227 bytes    
System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step, ref bool completedSynchronously) + 0x9c bytes 
System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception error) + 0x1a7 bytes  
System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData) + 0xf8 bytes  
System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest wr) + 0x284 bytes 
System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest wr) + 0x6e bytes  
System.Web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr) + 0x47 bytes  
WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Request.Process() + 0x188 bytes 
WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Microsoft.VisualStudio.WebHost.Connection conn) + 0x66 bytes    
[Appdomain Transition]  
WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(object acceptedSocket) + 0xa1 bytes   
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(object state) + 0x3e bytes 
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0xa7 bytes  
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x16 bytes  
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x60 bytes 
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x149 bytes  
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x5 bytes 
[Native to Managed Transition]  

問題を探す場所を教えてくれる人はいますか?

ありがとう

4

2 に答える 2

3

内部 DI コンテナーは、MVC に登録した IControllerFactory でデコレーター パターンを使用します。エンドポイントを呼び出す場合を除き/sitemap.xml、このクラスは登録済みの IControllerFactory を呼び出すだけです。カスタム コントローラーがある場合は、CreateController メソッドにブレークポイントを設定して、この場合 IControllerFactory がコントローラーを返さない理由を確認できるはずです。

カスタム IControllerFactory を使用していない場合、スクリプトという名前の存在しないコントローラーをチェックする方法で、ルートが誤って構成されていることに関係があると思います。コントローラーを解決するときに MVC がこのケースを考慮しないようにするために、RouteConfig.cs ファイルの上部近くにこれと同様の行を追加する必要がある可能性があります。

routes.IgnoreRoute("Scripts/{*pathInfo}");

それでも問題が解決しない場合は、GitHub でイシューを開くことをお勧めします。問題を示すデモ プロジェクトをビルドし、それを GitHub に投稿するか、圧縮してダウンロードできるようにすることができれば、解決策を見つけるのに大いに役立ちます。

于 2013-08-29T23:05:36.387 に答える