我在使用 MEF 动态加载的程序集中有一个 MVC3 区域。
如果我使用带有强类型 View 的 Webforms View 引擎,一切都会正常工作。
如果我将 Razor View 引擎与动态
模型结合使用,它也能正常工作。
但是如果我使用强类型 Razor View , View 编译会在运行时失败。
问题是动态加载的程序集不在传递给 C# 编译器的引用程序集列表中。
生成的 C# 代码如下所示:
namespace ASP {
using System;
/* Other namespaces */
public class _Page_MyApp_Views_Home_Index_cshtml
: System.Web.Mvc.WebViewPage<MyApp.ViewModels.Search.IndexViewModel> {
/* Generated code */
}
}
这是错误消息:
Compiler Error Message: CS0246: The type or namespace name 'MyApp' could not be found (are you missing a using directive or an assembly reference?)
您知道为什么这适用于 Webforms View 引擎但不适用于 Razor 吗? 有没有办法告诉编译器使用我的动态加载的程序集进行编译?
谢谢
最佳答案
当强类型 View 的编译由于无法找到类型而失败时,我遇到了类似的问题。 一种解决方案是创建继承自 RazorBuildProvider 的自定义构建提供程序:
public class CustomRazorBuildProvider : RazorBuildProvider
{
public override void GenerateCode(System.Web.Compilation.AssemblyBuilder assemblyBuilder)
{
Assembly a = Assembly.LoadFrom([PATH_TO_YOUR_ASSEMBLY]);
assemblyBuilder.AddAssemblyReference(a);
base.GenerateCode(assemblyBuilder);
}
}
然后您需要在 web.config 中注册此自定义构建提供程序:
<compilation debug="true" targetFramework="4.0">
<assemblies>
...
</assemblies>
<buildProviders>
<remove extension=".cshtml" />
<add extension=".cshtml" type="YouAssembly.CustomRazorBuildProvider, YourAssembly"/>
</buildProviders>
</compilation>
它可以工作,但坏处是每次编译 View 时都需要引用程序集。
Here ,我发布了一个更好的解决方案的问题(例如类似于 AppDomain.CurrentDomain.AddPrivatePath),您只需指定一次私有(private)路径,并且它将在目录级别,而不是程序集级别。
关于asp.net-mvc - 动态加载程序集中的强类型 Razor View 不会在运行时编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331591/