gpt4 book ai didi

c# - RazorEngine 3.4 抛出 System.ArgumentException : with cached @Layout and different Models

转载 作者:太空狗 更新时间:2023-10-30 01:18:56 25 4
gpt4 key购买 nike

我遇到 RazorEngine 3.4 缓存问题。我有一些电子邮件模板具有相同的 @Layout 但每个模板的 Models 不同。它工作正常,直到我尝试使用我读到的不使用缓存的缓存:“将导致可怕的性能和内存泄漏” from here .

所以我打开了它。这很简单但会导致一个问题:_Layout.cshtml 也与第一个模型类型一起缓存,当我尝试用不同的模型解析另一个模板时它会抛出异常: “System.ArgumentException:‘....model1...’类型的对象无法转换为‘...model2...’类型。”

我将 2 个单元测试写入 “IsolatedTemplateServiceTestFixture.cs” 以显示问题。第一个通过,但第二个失败,因为 TemplateService.SetModelExplicit() 函数想要为 使用不同的 Model 类型设置 template.Model 属性布局

private Mock<ITemplateResolver> _templateResolver;

[Test]
public void IsolatedTemplateService_CanParseTemplateWithLayout_WithOneSerializableModels_UseCache()
{
_templateResolver = new Mock<ITemplateResolver>();
var config = new TemplateServiceConfiguration()
{
Resolver = _templateResolver.Object
};

using (var service = new TemplateService(config))
{
_templateResolver.Setup(i => i.Resolve("test")).Returns("<html>@RenderBody()</html>");

const string template = @"@{Layout=""test"";}<h1>Hello @Model.Item1</h1>";
const string expected = "<html><h1>Hello World</h1></html>";

var model = new Tuple<string>("World");
string result = service.Parse(template, model, null, "C1");
string result2 = service.Parse(template, model, null, "C1");

Assert.That(result == expected, "Result does not match expected: " + result);
Assert.That(result2 == expected, "Result does not match expected: " + result2);
}
}

[Test]
public void IsolatedTemplateService_CanParseTemplateWithLayout_WithDifferentSerializableModels_UseCache()
{
_templateResolver = new Mock<ITemplateResolver>();
var config = new TemplateServiceConfiguration()
{
Resolver = _templateResolver.Object
};

using (var service = new TemplateService(config))
{
_templateResolver.Setup(i => i.Resolve("test")).Returns("<html>@RenderBody()</html>");

const string template = @"@{Layout=""test"";}<h1>Hello @Model.Item1</h1>";
const string expected = "<html><h1>Hello World</h1></html>";

var model = new Tuple<string>("World");
string result = service.Parse(template, model, null, "C1");
string result2 = service.Parse(template, model, null, "C1");

const string template2 = @"@{Layout=""test"";}<h1>Hello2 @Model.Item1</h1>";
const string expected2 = "<html><h1>Hello2 123</h1></html>";
var model2 = new Tuple<int>(123);

string result3 = service.Parse(template2, model2, null, "C2");

Assert.That(result == expected, "Result does not match expected: " + result);
Assert.That(result2 == expected, "Result does not match expected: " + result2);

Assert.That(result3 == expected2, "Result does not match expected: " + result3);
}
}

我的问题是:有人遇到同样的问题吗?什么是“好”的解决方法,直到它被修复(如果它真的发生了)?

更新:

使用最新版本(当前为 v.3.10),两个测试都通过了。所以问题解决了。

最佳答案

就像在 RazorEngine 中一样,布局具有固定类型,即使您没有在其中声明模型也是如此。第一次通过编译模板编译布局时,模板的模型类型也成为布局的类型。正如您所注意到的,当您尝试编译另一个具有不同类型的模板时,这会发生冲突。

您可以通过声明动态布局的模型类型来解决这个问题,即 @model dynamic

这应该可以解决问题。不需要更改实际模板。

关于c# - RazorEngine 3.4 抛出 System.ArgumentException : with cached @Layout and different Models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25142816/

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