Handlebars.Net遍历列表触发HandlebarsUndefinedBindingException的解决方法及嵌套列表属性访问咨询
Handlebars.Net遍历列表触发HandlebarsUndefinedBindingException的解决方法及嵌套列表属性访问咨询
嘿,我看了你的问题,首先揪出一个最关键的语法错误——你模板里写的Cost = {Cost}}少了一个左大括号!正确的写法应该是{{Cost}},这个语法问题大概率是触发HandlebarsUndefinedBindingException的主要原因,因为Handlebars解析模板时会因为语法不规范,无法正确识别绑定属性。
先给你修正后的正确模板写法:
{{#each InvoiceLines}} Desc = {{Description}} , Cost = {{Cost}} {{/each}}
如果你习惯用this明确指代当前列表项,也是完全可以的,只要把语法补全就行:
{{#each InvoiceLines}} Desc = {{this.Description}} , Cost = {{this.Cost}} {{/each}}
至于你尝试的{{InvoiceLine.Description}}写法是不对的,因为在#each块内部,上下文已经自动切换到单个InvoiceLine实例了,不需要再用类名去引用。
另外还要确认你的数据对象是否正确初始化:比如Data里的InvoiceLines列表有没有被实例化,并且添加了具体的InvoiceLine元素。举个正确的数据赋值例子:
var myData = new Data { IsRenewalInvoice = false, InvoiceLines = new List<InvoiceLine> { new InvoiceLine { Description = "月度订阅", Cost = "99.99" }, new InvoiceLine { Description = "附加服务", Cost = "29.99" } } };
如果InvoiceLines是null,Handlebars会直接跳过#each块,但不会抛出undefined异常,所以重点还是先把模板语法补对。
再来说你问的第二个问题:如果列表嵌套在Data的另一个对象里,当然可以访问列表项的属性!举个例子,假设你的Data结构改成这样:
public class Data { public bool IsRenewalInvoice { get; set; } public InvoiceWrapper InvoiceInfo { get; set; } // 嵌套的对象 } public class InvoiceWrapper { public List<InvoiceLine> InvoiceLines { get; set; } // 列表在嵌套对象里 }
那模板只需要调整#each的路径,直接指向嵌套的列表即可:
{{#each InvoiceInfo.InvoiceLines}} Desc = {{Description}} , Cost = {{Cost}} {{/each}}
如果需要在#each块内部访问上层上下文的属性(比如IsRenewalInvoice),可以用../来跳转上层上下文,比如:
{{#each InvoiceInfo.InvoiceLines}} {{#if ../IsRenewalInvoice}} 这是续费账单:{{Description}} - {{Cost}} {{else}} 这是新账单:{{Description}} - {{Cost}} {{/if}} {{/each}}
备注:内容来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

