有没有办法让 RazorEngine 抛出异常渲染使用 JSON 作为数据模型的模板?

Is there a way to make RazorEngine throw an exception rendering a template using JSON as the data model?

我正在尝试使用 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 提供给 RazorEngine 之前将其解析为 C# 对象来实现:

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 解析为一个数据模型,该模型将针对模板预期的缺失数据保留类型检查和编译时错误?

您可以更改代码以在反序列化对象时使用 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);

当 属性 不存在时抛出异常,当 属性 存在时 returns 预期结果。