我有一个视图,在同一页面上呈现了一堆相同的表单,并且 我想让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)?
答案 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);