Handlebars为何认为我的列表为空?C# .NET技术问题咨询
问题分析与解决
你的代码存在两个核心问题,导致仅显示表头而无数据行:
1. 模板遍历的上下文不匹配
模板中使用{{#each entry}}来遍历名为entry的列表,但你传入的是直接反序列化得到的List<TemplateParams>集合——这个集合本身并没有entry属性,Handlebars找不到可遍历的数据,因此不会渲染表格行。
2. 字段名拼写错误
模板里的{{data}}对应JSON中的date字段,拼写不一致,即便数据正常渲染,这一列也会显示空值。
解决方法一:修改模板,直接遍历根集合
把模板中的{{#each entry}}改为{{#each .}}(.代表当前上下文,即传入的整个列表),同时修正字段名:
string mySource = @"<table> <tr> <th>File Name</th> <th>Error</th> <th>Size</th> <th>Date</th> <th>Testing</th> </tr> {{#each .}} <tr> <td>{{fname}}</td> <td>{{error}}</td> <td>{{size}}</td> <td>{{date}}</td> <td>test data</td> </tr> {{/each}} </table>"; // 其余代码保持不变 var plz = JsonConvert.DeserializeObject<List<TemplateParams>>(json); var template = Handlebars.Compile(mySource); var result = template(plz);
解决方法二:包装列表,匹配模板结构
保持原模板不变,将反序列化后的列表包装到一个包含entry属性的对象中传入模板:
// 模板保持原{{#each entry}}结构不变 var plz = JsonConvert.DeserializeObject<List<TemplateParams>>(json); var template = Handlebars.Compile(mySource); // 包装成带entry属性的对象 var result = template(new { entry = plz });
注意:无论哪种方法,都需要将模板里的{{data}}改为{{date}},否则Date列会显示空值。
内容的提问来源于stack exchange,提问作者Justin Zitel
相关产品推荐
相关产品推荐

