You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:34:32