【问题标题】:Asp.Net MVC validation & knockout foreachAsp.Net MVC 验证和淘汰赛 foreach
【发布时间】:2014-04-13 17:37:31
【问题描述】:

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

【问题讨论】:

  • 没有必要合并两个解决方案。 KO为你做。
  • 其实不行,如果我使用KO foreach,MVC验证只对第一项有效:/

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


【解决方案1】:

过去我曾尝试强制将剃须刀和淘汰赛结合起来。但最近我只是选择了一种方式或另一种方式。如果我要在客户端渲染一些东西,那么我会直接用 HTML 定义一切,而不是通过 razor。

您最好的选择可能是直接定义 HTML 元素。如果您需要进行现场验证,那么只需确保两件事:

  1. 设置相应的 jquery 验证属性(例如 data-val-true),以便表单在客户端验证。
  2. 如果您要向 ASP.NET MVC 控制器提交数据,请确保元素具有控制器所需的相同名称/ID,以便在控制器方法参数上进行绑定。

【讨论】:

  • 嗨,Amhed,感谢您的反馈。现在我仍然想结合 Razor 和 Knockout。我刚刚找到了解决方案。有兴趣可以看我的回答。 :)
【解决方案2】:

所以,经过多次搜索和测试,我找到了解决方案:

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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-05
    • 2012-02-18
    • 1970-01-01
    • 2012-03-08
    • 2015-03-01
    • 2015-02-03
    • 2015-03-12
    • 2011-08-09
    相关资源
    最近更新 更多