使用PrecompiledMvc​​Engine FindView会抛出InvalidOperationException并查找View cshtml文件

时间:2013-02-20 03:40:26

标签: asp.net-mvc-3 precompile razorgenerator

当MVC控制器在使用InvalidOperationException时尝试FindView时,我得到PrecompiledMvcEngine

在具有VS2012,MVC4并部署到IIS的计算机上使用

1 个答案:

答案 0 :(得分:1)

查看ControllerBase.FindViewViewEngineCollection.FindViewVirtualPathProviderViewEnginePrecompiledMvcEngine的源代码后,发现PrecompiledMvc​​Engine中的_mappings计数为0.(反思和开源的Tx。)

原因是我的项目的DLL中没有可分配给WebPageRenderingBase的类型。在反编译我的dll时,它实际上有编译的视图,以及从WebPageRenderingBase扩展的视图。

在编写单元测试以执行与PrecompiledMvc​​Engine加载视图相同的操作后,发现它们使用的是不同版本的WebPageRenderingBase类。 RazorGenerator.Mvc使用System.Web.WebPages v1.0.0.0在构建时进行预编译。从已编译的程序集加载类型时,PrecompiledMvc​​Engine使用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文件中指定正确的版本,则通常会遇到此问题