我们目前使用 Razor 视图引擎来呈现 HTML(在 ASP.NET MVC 项目之外)。一切都运行良好,直到今天我向我的模型添加了一个位于另一个程序集中的枚举类型。现在当我编译时,会出现以下错误:
“RazorEngine.Templating.TemplateCompilationException was unhandled HResult=-2146233088 Message=无法编译模板。类型 'ClassLibrary1.MyClass.MyEnum' 在未被引用的程序集中定义。必须添加对程序集 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 的引用。”
我能够在简单的控制台应用程序中重现这个错误,该应用程序引用了来自外部 DLL 的类型:
模板:
我也尝试在模板中添加"@using ExternalLib;",但是结果出现了一个错误,即找不到类型"ExternalLib"。我看到了一两篇关于类似问题的帖子(Razor-based view doesn't see referenced assemblies),但这不是一个Web应用程序的情况。感谢任何帮助。
编辑: 昨天我有点过早宣布这个修复了我的错误。 它在我的测试应用程序中修复了我的错误,但当我去更新我的代码时,它并没有起作用。 稍微再看了一下,我意识到我的模型有点复杂。
我已经相应地更新了我的示例应用程序:
模型:
使用这段代码,如果我将 @using ExternalLib; 语句添加到模型中,就会出现错误“无法编译模板。找不到类型或命名空间名称 'ExternalLib'(您是否缺少使用指令或程序集引用?)”
如果我省略 @using 语句,则会出现异常“无法编译模板。类型 'ExternalLib.ParentClass' 定义在一个未被引用的程序集中。必须向程序集 'ExternalLib,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null' 添加引用。”
修正(或至少解决方法)
通过创建一个独立的模型和模板来处理子类,并在模板中使用 @Include 语句导入它,我已经成功解决了问题。如果有人感兴趣,我可以发表那段代码,但我担心我的帖子已经太长了。
“RazorEngine.Templating.TemplateCompilationException was unhandled HResult=-2146233088 Message=无法编译模板。类型 'ClassLibrary1.MyClass.MyEnum' 在未被引用的程序集中定义。必须添加对程序集 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 的引用。”
我能够在简单的控制台应用程序中重现这个错误,该应用程序引用了来自外部 DLL 的类型:
模板:
@model RazorExample.MyModel
<div>
@if(Model.EnumValue == ExternalLib.MyEnum.Val1) { <p>My value is 1</p> }
</div>
枚举类型(定义在ExternalLib中):
namespace ExternalLib
{
public enum MyEnum
{
Val1 = 1,
Val2 = 2
}
}
型号:
using ExternalLib;
namespace RazorExample
{
public class MyModel
{
public String Name { get; set; }
public MyEnum EnumValue{ get; set; }
}
}
编译模板的代码:
Razor.Compile(template.ToString(), "MyTemplate");
我也尝试在模板中添加"@using ExternalLib;",但是结果出现了一个错误,即找不到类型"ExternalLib"。我看到了一两篇关于类似问题的帖子(Razor-based view doesn't see referenced assemblies),但这不是一个Web应用程序的情况。感谢任何帮助。
编辑: 昨天我有点过早宣布这个修复了我的错误。 它在我的测试应用程序中修复了我的错误,但当我去更新我的代码时,它并没有起作用。 稍微再看了一下,我意识到我的模型有点复杂。
我已经相应地更新了我的示例应用程序:
模型:
public class MyModel
{
public String Name { get; set; }
public ParentClass ParentClass { get; set; }
}
父类:
namespace ExternalLib
{
public class ParentClass
{
public string Name { get; set; }
public ChildClass ChildClass { get; set; }
}
}
子类:
namespace ExternalLib
{
public class ChildClass
{
public enum MyEnum
{
Val1 = 1,
Val2 = 2
}
}
}
模型:
@model RazorExample.MyModel
<div>
@if(Model.ParentClass.ChildClass.EnumValue == ExternalLib.ChildClass.MyEnum.Val1) { <p>My value is 1</p> }
</div>
使用这段代码,如果我将 @using ExternalLib; 语句添加到模型中,就会出现错误“无法编译模板。找不到类型或命名空间名称 'ExternalLib'(您是否缺少使用指令或程序集引用?)”
如果我省略 @using 语句,则会出现异常“无法编译模板。类型 'ExternalLib.ParentClass' 定义在一个未被引用的程序集中。必须向程序集 'ExternalLib,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null' 添加引用。”
修正(或至少解决方法)
通过创建一个独立的模型和模板来处理子类,并在模板中使用 @Include 语句导入它,我已经成功解决了问题。如果有人感兴趣,我可以发表那段代码,但我担心我的帖子已经太长了。
using
引用。 - RyanCJI