【问题标题】:Strongly typed Razor views in dynamically loaded assembly don't compile at runtime动态加载的程序集中的强类型 Razor 视图不会在运行时编译
【发布时间】:2011-03-16 20:51:34
【问题描述】:

我在一个程序集中有一个 MVC3 区域,它使用 MEF动态加载
如果我将 Webforms 视图引擎与强类型视图一起使用,则一切正常。
如果我将 Razor 视图引擎与 dynamic 模型一起使用,它也可以正常工作。

但如果我使用强类型 Razor 视图,视图编译会在运行时失败。

问题是动态加载的程序集不在传递给 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 视图引擎而不适用于 Razor 吗? 有没有办法告诉编译器使用我动态加载的程序集进行编译?

谢谢

【问题讨论】:

  • 我也有同样的问题

标签: asp.net-mvc razor mef


【解决方案1】:

当强类型视图的编译由于无法找到类型而失败时,我遇到了类似的问题。 一种解决方案是创建从 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>

它可以工作,但不好的是每次编译视图时都需要引用程序集。

Here,我已经发布了一个更好的解决方案的问题(例如类似于 AppDomain.CurrentDomain.AddPrivatePath),您只需指定一次私有路径,它将在目录级别,而不是在程序集级别。

【讨论】:

    【解决方案2】:

    您从哪里加载程序集?通常(如我的博客here 中所讨论的)如果您不从 /bin 目录加载程序集,则需要确保程序集的路径是可发现的。我以前这样做的方法是使用AppDomain.CurrentDomain.AppendPrivatePath(path)。尽管这是一种已弃用的方法,但您并没有自己构建 AppDomain(IIS 工作进程在托管您的应用程序时会执行此操作),您仍然可以使用它来更新当前域以在此处搜索。现在,当一个程序集被解析时,如果它不是 GAC 的,AppDomain 将在它的私有路径中搜索该程序集。

    至于为什么它适用于 WebForms 而不是 Razor,我们需要更多地了解您的项目架构。

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      相关资源
      最近更新 更多