将绑定应用于相同的DOM元素组

时间:2014-11-18 19:55:26

标签: jquery asp.net-mvc knockout.js

我有一个视图,在同一页面上呈现了一堆相同的表单,并且 我想让Knockout的数据绑定适用于页面上的每个表单。

我在主视图上渲染所有表单 - 每个表单都在自己的PartialView中,如下所示:

@Model Forms.Models.ViewModels.MasterViewModel

@foreach (var form in Model.Form.ToList())
{
    Html.RenderPartial("_Form", form);
}

但是因为所有表单都是相同的,所有表单都使用相同的数据绑定,而MVC使用相同的ID呈现它们:

部分视图

@Html.LabelFor(m => m.foo)
@Html.TextBoxFor(m => m.foo, new { @class = "form-control", data_bind = "value: foo" })
@Html.ValidationMessageFor(m => m.foo)

我可以做些什么来将Knockout的绑定应用于页面上的每个表单,或者这是一个无法做到的事情(例如,因为MVC不介意使用HTML inputs呈现HTML {{1}}相同的ID)?

1 个答案:

答案 0 :(得分:2)

在不知道你的数据是如何建模的情况下,这是一个黑暗中的镜头。

在此,我假设所有表单数据都包含在地图中,可以由服务器端模型中表示的某个关键字段引用。

@foreach (var form in Model.Form.ToList())
{
    <!-- ko with: items[@form.Key] -->
    Html.RenderPartial("_Form", form);
    <!-- /ko -->
}

通过该示例,您可能只有一个对象代表所有模型:

ko.applyBindings(formData); //assuming formData.items

如果你只想要数组但没有容器,你可以稍微修改一下:

@foreach (var form in Model.Form.ToList())
{
    <!-- ko with: @parent[@form.Key] -->
    Html.RenderPartial("_Form", form);
    <!-- /ko -->
}

...

ko.applyBindings(items);