0

当MVCInvalidOperationException控制器尝试FindView使用PrecompiledMvcEngine.

在具有 VS2012、MVC4 并部署到 IIS 的机器上使用

4

1 回答 1

1

在查看ControllerBase.FindViewto ViewEngineCollection.FindViewto VirtualPathProviderViewEngine to PrecompiledMvc ​​Engine 的源代码后,发现_mappingsPrecompiledMvc​​Engine 中的计数为 0。(Tx to Reflection and Open source。)

原因是我项目的 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 文件中指定正确的版本,则经常会遇到此问题

于 2013-02-20T03:43:42.003 回答