当MVCInvalidOperationException
控制器尝试FindView
使用PrecompiledMvcEngine
.
在具有 VS2012、MVC4 并部署到 IIS 的机器上使用
当MVCInvalidOperationException
控制器尝试FindView
使用PrecompiledMvcEngine
.
在具有 VS2012、MVC4 并部署到 IIS 的机器上使用
在查看ControllerBase.FindView
to ViewEngineCollection.FindView
to VirtualPathProviderViewEngine to PrecompiledMvc Engine 的源代码后,发现_mappings
PrecompiledMvcEngine 中的计数为 0。(Tx to Reflection and Open source。)
原因是我项目的 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 文件中指定正确的版本,则经常会遇到此问题