我有一个MVC 4验证&淘汰赛问题。
我尝试了这个解决方案:
Translate knockout into razor to keep it's validation working
但我遇到的问题与有效回答的评论中列出的相同=>验证仅适用于第一个元素。
经过多次搜索,我发现这篇关于模型绑定到列表的文章:
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/
我想知道如何合并这两种解决方案。
验证的样本仅适用于第一个元素:
Dim dummy As ViewModels.ObjectViewModel = Model.MyObjects.FirstOrDefault
@<tbody data-bind='foreach: MyObjects'>
<td>
@Html.TextBoxFor(Function(model) dummy.Label, New With {.data_bind = "value: Label"})
</td>
</tbody>
验证工作的示例,但没有淘汰赛的foreach,我无法动态添加项目
<tbody>
@Code
Dim i As Integer = 0
For Each object In Model.MyObjects
@<tr>
<td>
@Html.TextBoxFor(Function(m) Model.MyObjects(i).Label)
</td>
</tr>
i+= 1
Next
End Code
</tbody>
也许是淘汰变量:$ index()?
答案 0 :(得分:1)
因此,经过多次搜索和测试后,我找到了解决方案:
1°步骤是为验证添加正确的名称。
Razor查看代码:
Dim dummy As ViewModels.ObjectViewModel = Model.MyObjects.FirstOrDefault
<tbody data-bind='foreach: MyObjects'>
<td>
@Html.TextBoxFor(Function(model) dummy.Label, New With {.data_bind = "value: Label, attr: { name: 'MyObjects[' + $index() + '].Label'}"})
</td>
</tbody>
你得到第一项的HTML:name =“MyObjects [0] .Label”
哪个很酷并且可以进行验证。
但是,如果您动态添加项目,则验证将不适用于新项目。
2°步骤是让不显眼的验证重新解析您的表单。
JavaScript
viewModel.addObject = function () {
viewModel.MyObjects.push(new object())
$("form").data("validator", null);
$.validator.unobtrusive.parse($("form"));
};
这两个答案对我帮助很大: