【问题标题】:Referencing type that is in another assembly causes "the type is defined in an assembly that is not referenced" error in Razor.Compile()引用另一个程序集中的类型会导致 Razor.Compile() 中出现“类型是在未引用的程序集中定义的”错误
【发布时间】:2014-12-15 18:31:57
【问题描述】:

我们目前正在使用 Razor 视图引擎来呈现 HTML(在 ASP.NET MVC 项目之外)。直到今天,当我将枚举类型添加到驻留在另一个程序集中的模型中时,一切都运行良好。现在当我编译时,我收到以下错误:

“RazorEngine.Templating.TemplateCompilationException 未处理
HResult=-2146233088 消息=无法编译模板。方式 'ClassLibrary1.MyClass.MyEnum' 是在不是 参考。您必须添加对程序集 'ClassLibrary1, 版本=1.0.0.0,文化=中性,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 ExtneralLib;”到模板,但这会导致无法找到类型“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 指令或程序集引用?)”

如果我不使用 @using 语句,我会收到异常“无法编译模板。'ExternalLib.ParentClass' 类型是在未引用的程序集中定义的。您必须添加对程序集“ExternalLib,版本”的引用=1.0.0.0,Culture=neutral,PublicKeyToken=null'。"

修复(或至少解决方法)
通过为子类创建单独的模型和模板并在模板中使用@Include 语句将其导入,我能够在我试图开始工作的代码中解决此问题。如果有人感兴趣,我可以发布该代码但是我担心我的帖子已经有点长了。

【问题讨论】:

  • 明显的问题:您是否真的在解决方案资源管理器中右键单击您的项目并Add Reference... 到 ClassLibrary1?
  • 与@Eris 相同的问题...此外,您仍需要在视图顶部提供using 参考
  • 我确实添加了参考。此外,我尝试添加 @using 语句,但没有运气。 Rich 在下面的回答(#1)解决了我的问题。谢谢。

标签: c# .net asp.net-mvc razor


【解决方案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 - 您列表中的第 2 项是我在尝试澄清代码时错过的更改。你名单上的第一名对我有用,非常感谢!
猜你喜欢
  • 2015-03-29
  • 2017-01-31
  • 2016-09-04
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多