c# - 引用另一个程序集中的类型导致 Razor.Compile() 中出现 "the type is defined in an assembly that is not referenced"错误

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

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

"RazorEngine.Templating.TemplateCompilationException was unhandled
HResult=-2146233088 Message=Unable to compile template. The type 'ClassLibrary1.MyClass.MyEnum' is defined in an assembly that is not referenced. You must add a reference to assembly '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 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,Version’的引用=1.0.0.0,Culture=neutral,PublicKeyToken=null'。”

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

最佳答案

你的代码有两处错误:

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.

关于c# - 引用另一个程序集中的类型导致 Razor.Compile() 中出现 "the type is defined in an assembly that is not referenced"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27490721/

相关文章:

.net - WPF 覆盖多个窗口

asp.net-mvc - ASP.NET MVC : DropDownList -- Of DataSource, SelectedItem,以及 View 内的内联代码访问

c# - 如何使用 livecharts 动态创建笛卡尔图表

c# - 无法在 Windows 窗体中选择特定控件

c# - 为什么 Line.Stroke.ToString() 返回 8 个符号的十六进制代码

c# - Web Api - Controller 外部请求参数

c# - 迁移在 Visual Studio CTP 6 vNext 项目中不起作用

c# - FTP 连接在几个小时后关闭(2 :10) C#, MySQL 或 Proftpd?

c# - UWP:ListView ItemClick 不起作用

c# - 如果存在则更新,否则插入会抛出我的 DAL