我正在尝试使用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, "templateKey", null, model);
// TemplateCompilationException
这是我想要的非常有用的行为。但是,出于我的目的,数据模型的源必须是JSON。通过将JSON解析为C#对象然后再将其提供给RazorEngine即可轻松实现:
String json = @"{ name: 'World' }";
var jsonModel = JsonConvert.DeserializeObject(json);
var result = Engine.Razor.RunCompile(template, "templateKey", null, jsonModel);
// result = "<h1>Hello world!</h1>"
,但是问题在于此过程似乎破坏了编译过程中的类型检查:
String json = @"{ }";
var jsonModel = JsonConvert.DeserializeObject(json);
var result = Engine.Razor.RunCompile(template, "templateKey", null, jsonModel);
// result = "<h1>Hello !</h1>"
有没有一种方法可以将JSON解析为一个数据模型,该模型可以保留类型检查和编译时错误,以防止模板丢失数据?
答案 0 :(得分:1)
反序列化对象时,您可以更改代码以使用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, "templateKey", null, model);
当该属性不存在时会引发异常,并在该属性存在时返回预期结果。