我跟着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));
它与强类型对象一起工作正常,但是对于匿名对象,我从第二次运行时开始收到此消息:
用于模拟的令牌无效 - 无法复制
如何解决此问题并仍然使用模型的匿名对象?
我看过建议将匿名对象转换为ExpandoObject
的解决方案(here,here),但如果可能的话,我想避免这种情况。
答案 0 :(得分:1)
在阅读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
)