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
)