动态加载的程序集中的强类型Razor视图不会在运行时编译

时间:2011-03-16 20:51:34

标签: asp.net-mvc razor mef

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

但如果我使用强类型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? 有没有办法告诉编译器使用我的动态加载程序集进行编译?

由于

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

由于无法找到类型,强类型视图的编译失败时,我遇到了类似的问题。 一种解决方案是创建继承自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),您只需指定一次私有路径,它将在目录级别,而不是在程序集级别