如何将敲门验证应用于MVC传递的每个项目列表的属性?

时间:2013-03-12 00:45:20

标签: asp.net-mvc knockout.js knockout-2.0 knockout-validation knockout-mvc

以下是ASP.NET MVC中的视图模型:

public class Email
{
  public string Selected { get; set; }
  public string Name { get; set; }
}
public class User
{
  public string UserName { get; set; }
  public IList<Email> Emails { get; set; }
}

在定义挖空视图模型时,它会被传递到视图中并且看起来像这样:

var viewModel = {
  UserName: ko.observable("@Model.UserName"),
  Emails: ko.observableArray(@Html.Json(@Model.Emails) || []),
  // many other things
}

我想确保Email.Selectedrequired。如何使用列表而不是单个对象。我知道这一定是最简单的问题,但我找不到关于这个主题的任何内容。

我在客户端上使用敲除验证,因为不幸的是,Fluent和数据注释不适用于淘汰赛。

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的淘汰赛自定义验证可以提供帮助,这里我将添加一个如何在您的情况下使用淘汰赛自定义验证的示例:

var viewModel = {
  UserName: ko.observable("@Model.UserName"),
  Emails: ko.observableArray(@Html.Json(@Model.Emails) || []).
          extend({
             customRequired: { message: 'Selected is required' }
          });

  // many other things
}


ko.validation.rules['customRequired'] = {
    validator: function (emailList) {
        var pass = true;
        ko.utils.arrayFirst(emailList(), function(email){
           if(email.Selected == '')       //if Selected property is empty
           {
             pass = false;
             return true;                 //break the loop
           }
        });
       return pass;
    }
};