Asp.Net MVC验证&淘汰赛

时间:2014-03-10 14:38:04

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

我有一个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()?

1 个答案:

答案 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"));    
    };

这两个答案对我帮助很大:

Knockout MVC with existing C# code - looping

MVC Model Validation on a dynamic form?