TemplateService.Parse 使用匿名模型和缓存名称时给出 "Invalid token for impersonation - it cannot be duplicated"
TemplateService.Parse gives "Invalid token for impersonation - it cannot be duplicated" when using anonymous model and cache name
我已经按照 this tutorial 使用 RazorEngine 生成 HTML 电子邮件(没有 ASP.NET MVC)。当我使用强类型视图或匿名对象作为模型时,它工作正常:
Layout.cshtml
@model dynamic
// html contents...
C# 片段
var template = Encoding.UTF8.GetString(Properties.Resources.ContractList);
var model = new
{
ContractList = list
};
var templateService = new TemplateService();
var html = templateService.Parse(template, model, null, null);
然后我按照third part of the tutorial:
上的推荐给它取了个缓存名
templateService.Parse(template, model, null, nameof(Properties.Resources.ContractList));
它在强类型对象上运行良好,但在匿名对象上我从第二次开始收到这条消息 运行:
Invalid token for impersonation - it cannot be duplicated
如何解决这个问题并仍然为模型使用匿名对象?
我已经看到建议将匿名对象ExpandoObject
转换为 ExpandoObject
的解决方案 (here, here),但我希望尽可能避免这种情况。
阅读 RazorEngine 文档后,我在他们的 upgrading page 上找到了一些示例,这些示例展示了如何使用 Engine.Razor
。最简单的方法是:
var html = Engine.Razor.RunCompile(
template,
nameof(Properties.Resources.ContractList),
null,
model
);
这解决了问题。请注意,他们不推荐上述格式,因为在内部它每次都会调用 AddTemplate
,并且当您对不同模板使用相同的 cache_name
时会抛出异常。相反,他们建议在启动时进行预编译:
// Once at startup (not required when using an ITemplateManager which knows how to
// resolve cache_name)
Engine.Razor.AddTemplate(cache_name, razorTemplate)
// On startup
Engine.Razor.Compile(
cache_name,
typeof(MyModel) /* or model.GetType() or null for 'dynamic'*/
)
// instead of the Razor.Parse call
var result = Engine.Razor.Run(
cache_name,
typeof(MyModel), /* or model.GetType() or null for 'dynamic'*/
model
)
我已经按照 this tutorial 使用 RazorEngine 生成 HTML 电子邮件(没有 ASP.NET MVC)。当我使用强类型视图或匿名对象作为模型时,它工作正常:
Layout.cshtml
@model dynamic
// html contents...
C# 片段
var template = Encoding.UTF8.GetString(Properties.Resources.ContractList);
var model = new
{
ContractList = list
};
var templateService = new TemplateService();
var html = templateService.Parse(template, model, null, null);
然后我按照third part of the tutorial:
上的推荐给它取了个缓存名templateService.Parse(template, model, null, nameof(Properties.Resources.ContractList));
它在强类型对象上运行良好,但在匿名对象上我从第二次开始收到这条消息 运行:
Invalid token for impersonation - it cannot be duplicated
如何解决这个问题并仍然为模型使用匿名对象?
我已经看到建议将匿名对象ExpandoObject
转换为 ExpandoObject
的解决方案 (here, here),但我希望尽可能避免这种情况。
阅读 RazorEngine 文档后,我在他们的 upgrading page 上找到了一些示例,这些示例展示了如何使用 Engine.Razor
。最简单的方法是:
var html = Engine.Razor.RunCompile(
template,
nameof(Properties.Resources.ContractList),
null,
model
);
这解决了问题。请注意,他们不推荐上述格式,因为在内部它每次都会调用 AddTemplate
,并且当您对不同模板使用相同的 cache_name
时会抛出异常。相反,他们建议在启动时进行预编译:
// Once at startup (not required when using an ITemplateManager which knows how to
// resolve cache_name)
Engine.Razor.AddTemplate(cache_name, razorTemplate)
// On startup
Engine.Razor.Compile(
cache_name,
typeof(MyModel) /* or model.GetType() or null for 'dynamic'*/
)
// instead of the Razor.Parse call
var result = Engine.Razor.Run(
cache_name,
typeof(MyModel), /* or model.GetType() or null for 'dynamic'*/
model
)