gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:34:12 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com