使用匿名模型和缓存名称

时间:2015-12-10 16:38:02

标签: c# razor razorengine

我跟着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的解决方案(herehere),但如果可能的话,我想避免这种情况。

1 个答案:

答案 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
)