gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:45:31 27 4
gpt4 key购买 nike

我们目前正在使用 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/

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