asp.net-mvc - 动态加载程序集中的强类型 Razor View 不会在运行时编译

标签 asp.net-mvc razor mef

我在使用 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/

相关文章:

c# - Razor 是倒退了一步吗?

c# - 从仅给定 Type 实例的 MEF 容器中获取导出

c# - MEF更新导出的部件元数据(元数据 View 无效,因为属性有属性设置方法)

html - HTML 和 ASP.NET MVC 3 Razor 中隐藏输入和非常大的值的问题

c# - ASP.NET MVC 与 Winforms MVC

c# - 两套 Controller

c# - 如何替换 MEF 容器中导出的部件/对象?

asp.net-mvc - 想要使用通用基类作为 asp.net MVC View 的模型

c# - 带有伪选择器(和引导图标)的 ASP.NET Core asp-fallback 标记帮助器

c# - 在 Razor 中增加索引计数器