我正在尝试使用
RazorEngine作为我的模板语言在ASP.NET中设计一个电子邮件模板系统. RazorEngine采用电子邮件模板(作为字符串或.cshtml文件)并将其与数据模型组合以将输出生成为字符串.可以以多种格式提供数据模型.
例如:
string template = "<h1>Hello @Model.name!</h1>"; var model = new { name = "world" }; var result = Engine.Razor.runcompile(template,"templateKey",null,model); // result = "<h1>Hello World!</h1>"
如果模板期望数据模型未提供的值,则假设数据模型作为C#对象提供,runcompile方法将抛出异常:
string template = "<h1>Hello @Model.name!</h1>"; var model = new { }; var result = Engine.Razor.runcompile(template,model); // TemplateCompilationException
这是我想要的非常有用的行为.但是,就我的目的而言,数据模型的源必须是JSON.通过在将JSON提供给RazorEngine之前将其解析为C#对象,可以轻松实现这一点:
String json = @"{ name: 'World' }"; var jsonModel = JsonConvert.DeserializeObject(json); var result = Engine.Razor.runcompile(template,jsonModel); // result = "<h1>Hello World!</h1>"
,但问题是这个过程似乎破坏了编译过程中的类型检查:
String json = @"{ }"; var jsonModel = JsonConvert.DeserializeObject(json); var result = Engine.Razor.runcompile(template,jsonModel); // result = "<h1>Hello !</h1>"
有没有办法可以将JSON解析为数据模型,这将保留模板所需的缺失数据的类型检查和编译时错误?
解决方法
在反序列化对象时,可以更改代码以使用ExpandoObjectConverter:
var template = "<h1>Hello @Model.name!</h1>"; var json = @"{ }"; var converter = new Newtonsoft.Json.Converters.ExpandoObjectConverter(); var model = JsonConvert.DeserializeObject<System.Dynamic.ExpandoObject>(json,converter); var result = Engine.Razor.runcompile(template,model);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。