在Razor.Compile()中引用另一个程序集中的类型会导致“该类型在未被引用的程序集中定义”的错误。

3
我们目前使用 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 的类型:
模板:
@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 语句导入它,我已经成功解决了问题。如果有人感兴趣,我可以发表那段代码,但我担心我的帖子已经太长了。

1
显而易见的问题:您是否实际在解决方案资源管理器中右键单击项目并“添加引用...”到ClassLibrary1? - Eris
与 @Eris 相同的问题...此外,您仍需要在视图顶部使用 using 引用。 - RyanCJI
我已经添加了引用。此外,我尝试添加@using语句,但没有成功。下面是Rich的答案(#1),解决了我的问题。谢谢。 - Mike Watkins
1个回答

1

你的代码有两个问题:

1:在调用 Razor.Compile(...) 时,你需要指定模型对象的类型:

Razor.Compile(template.ToString(), typeof(MyModel), "MyTemplate");

2:您的模板检查ExternalLib.MyEnum == ExternalLib.MyEnum.Val1的值,但是您的模型枚举值属性是MyNestedEnum,而不是MyEnum

请将您的模板更改为以下内容:

@model RazorExample.MyModel  

<div>  
    @if(Model.MyNestedEnum == ExternalLib.MyEnum.Val1) { <p>My value is 1</p> }  
</div>  

HTH.


谢谢Rich - 你列表中的第二点是我的一个疏忽,当我试图澄清代码时错过了修改。而你列表中的第一点对我有帮助,非常感谢! - Mike Watkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接