代码之家  ›  专栏  ›  技术社区  ›  Captain Stack

有没有一种方法可以让razorence抛出一个异常,用json作为数据模型呈现一个模板?

  •  4
  • Captain Stack  · 技术社区  · 6 年前

    我正在尝试在ASP.NET中使用 RazorEngine 作为我的模板语言。RazoEngine接受一个电子邮件模板(作为一个字符串或.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>"
    

    如果模板期望的值不是数据模型提供的,则runcompile方法将引发异常,前提是数据模型是作为C对象提供的:

    string template = "<h1>Hello @Model.name!</h1>";
    var model = new {  };
    var result = Engine.Razor.RunCompile(template, "templateKey", null, model);
    // TemplateCompilationException
    

    这是我想要的非常有用的行为。但是,就我而言,数据模型的源必须是JSON。在将JSON提供给RazoEngine之前,可以很容易地将其解析为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解析为一个数据模型,它将保留模板所期望的丢失数据的类型检查和编译时错误?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Reza Aghaei    6 年前

    您可以更改代码以使用 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);
    

    当属性不存在时引发异常,当属性存在时返回预期结果。