加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 有没有办法让RazorEngine抛出异常,使用JSON作为数据模型渲

发布时间:2020-12-15 22:51:56 所属栏目:百科 来源:网络整理
导读:我正在尝试使用 RazorEngine作为我的模板语言在ASP.NET中设计一个电子邮件模板系统. RazorEngine采用电子邮件模板(作为字符串或.cshtml文件)并将其与数据模型组合以将输出生成为字符串.可以以多种格式提供数据模型. 例如: string template = "h1Hello @Mode
我正在尝试使用 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);

当属性不存在时抛出异常,并在属性存在时返回预期结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读