.NET 5中Handlebars.NET模板占位符无法填充数据的问题
解决Handlebars.NET模板占位符未被正确替换的问题
你的问题核心很明确:你传入模板的是JSON字符串,但Handlebars.NET无法直接从字符串中读取属性,它需要的是一个.NET对象(匿名类、强类型类或解析后的动态对象),所以才会出现占位符被替换为空的情况。
下面给你两种最常用的解决方案:
方案1:使用匿名类作为上下文(最简单直接)
直接创建一个匿名对象来存储你的上下文数据,不需要JSON字符串,Handlebars.NET可以直接识别对象的属性:
// 替换原来的JSON字符串定义 var context = new { customer = "mycustomer", tenant = "mytenant" }; // 原有的编译和渲染代码保持不变 var template = Handlebars.Compile(html); string finalHtml = template(context);
方案2:解析JSON字符串为动态对象(适合JSON来自外部场景)
如果你的JSON数据是从文件、API接口等外部来源获取的,需要先把JSON字符串解析成.NET能识别的动态对象:
方式A:使用System.Text.Json(.NET 5内置,无需额外NuGet)
using System.Text.Json; // 你的原始JSON字符串 var contextJson = "{ \"customer\" : \"mycustomer\", \"tenant\" : \"mytenant\" }"; // 解析为动态对象 var context = JsonSerializer.Deserialize<dynamic>(contextJson); // 编译并渲染模板 var template = Handlebars.Compile(html); string finalHtml = template(context);
方式B:使用Newtonsoft.Json(需要安装Newtonsoft.Json NuGet包)
如果你习惯用Newtonsoft.Json,也可以这样处理:
using Newtonsoft.Json; var contextJson = "{ \"customer\" : \"mycustomer\", \"tenant\" : \"mytenant\" }"; var context = JsonConvert.DeserializeObject<dynamic>(contextJson); var template = Handlebars.Compile(html); string finalHtml = template(context);
验证效果
修改后重新运行代码,生成的finalHtml就会正确替换占位符,得到你预期的结果:
<script id="handlebars-demo" type="text/x-handlebars-template"> <h1>Data Report for mycustomer</h1> <h2>Tenant: mytenant</h2> <p> This is for testing. </p> </script>
内容的提问来源于stack exchange,提问作者Brad Y.
相关产品推荐
相关产品推荐

