当MVC控制器在使用InvalidOperationException
时尝试FindView
时,我得到PrecompiledMvcEngine
。
在具有VS2012,MVC4并部署到IIS的计算机上使用
答案 0 :(得分:1)
查看ControllerBase.FindView
到ViewEngineCollection.FindView
到VirtualPathProviderViewEngine到PrecompiledMvcEngine的源代码后,发现PrecompiledMvcEngine中的_mappings
计数为0.(反思和开源的Tx。)
原因是我的项目的DLL中没有可分配给WebPageRenderingBase的类型。在反编译我的dll时,它实际上有编译的视图,以及从WebPageRenderingBase扩展的视图。
在编写单元测试以执行与PrecompiledMvcEngine加载视图相同的操作后,发现它们使用的是不同版本的WebPageRenderingBase类。 RazorGenerator.Mvc使用System.Web.WebPages v1.0.0.0在构建时进行预编译。从已编译的程序集加载类型时,PrecompiledMvcEngine使用System.Web.WebPages v2.0.0.0。通过更改我的MVC csproject以在运行时加载v1.0.0.0来解决此问题。
更改
<Reference Include="System.Web.WebPages" />
获得了2.0.0.0到
<Reference Include="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
迫使它总是拿起1.0.0.0。如果要将预编译视图部署到安装了VS2012和MVC4的计算机,而不在csproj文件中指定正确的版本,则通常会遇到此问题