2016-03-07 79 views
0

我正在使用ASP.NET MVC 5并在客户端希望使用JQuery不显眼的验证。ASP.NET MVC自定义验证列表<string>

以下是我的模型:

public class CompanyModel 
    { 
     public CompanyModel() 
     { 
      Employees = new List<EmployeeModel>();    
     } 
     public int CompanyId{ get; set; } 

     public List<EmployeeModel> Employees { get; set; }   
    } 

    public class EmployeeModel 
    { 
     public EmployeeModel() 
     { 
      Values = new List<string>(); 
     } 

     public string Id { get; set; } 

     public string Name { get; set; } 

     [RequiredIf("IsRequired", true, "Atleast one value is required")] 
     public List<string> Values { get; set; } 

     public bool IsRequired { get; set; } 
    } 

我能够实现RequiredIf定制服务器端成功属性。但我努力让客户端验证会...

在通过员工列表视图我环路和值集合势必

@for (var index = 0; index < Model.Employees.Count; index++) 
{ 
     /// some other code 

    @for (int i = 0; i < Model.employees[index].Values.Count; i++) 
    { 
     @Html.TextBoxFor(m => m.Employees[index].Values[i], new {@autocomplete = "false" }) 
    }  
} 

的IsRequired属性是隐藏字段:

@Html.HiddenFor(m => m.Employees[index].IsRequired) 

以下是我目前使用的GetClientValidationRules方法的代码。

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
      { 
       var rule = new ModelClientValidationRule 
       { 
        ErrorMessage = ErrorMessage, 
        ValidationType = "requiredif" 
       };    

       rule.ValidationParameters["dependentproperty"] = (context as ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldId(DependentProperty); 
       rule.ValidationParameters["dependentpropertyvalue"] = DependentPropertyValue.ToString().ToLower(); 

       yield return rule;    
      } 

我看不到验证HTML(data-val- *)属性添加到HTML标记中的值。我不期望他们,因为我认为我错过了一些东西。如何获取在html中使用data-val-requiredif属性填充的值集合的所有元素。

任何想法?

供参考:html中的dependentpropertyId填充像EmployeeModel.Employees_0_IsRequired for Employee [0]一样。

+1

您无法获取jQuery客户端端v因为您无法为集合生成表单控件(仅针对集合的属性),因此属性是集合的alidation。您需要编写自己的客户端脚本才能显示您自己的客户端消息。 –

+0

好的,谢谢我看到。 @StephenMuecke然后你建议做一些类似于这里所接受的答案的东西。 http://stackoverflow.com/questions/5662589/unobtrusive-mvc3-validating-group-of-checkboxes或手动添加data-val和data-val-requiredif属性到html,然后编写一个jQuery验证适配器? – user1527762

+0

@Sparky(http://stackoverflow.com/users/594235/sparky)同样的问题也给你了吗? – user1527762

回答

1

那里有小点,包括在验证属性GetClientValidationRules()方法,因为它的目的是将data-val-*属性添加到该财产所产生的表单控件,广告不产生财产Values输入(如果你确实,绑定会失败)。解决这个问题的一种方法是处理表单.submit()事件,检查集合中是否至少有一个项目有值,如果不取消提交并显示错误。

修改您的视图包括验证消息占位符,并添加一个类名的输入,选择

@for (var index = 0; index < Model.Employees.Count; index++) 
{ 
    .... 
    <div class="value-group"> // necessary for relative selectors 
     @for (int i = 0; i < Model.employees[index].Values.Count; i++) 
     { 
      @Html.TextBoxFor(m => m.Employees[index].Values[i], new { @class="value", autocomplete = "false" }) 
     } 
     @Html.ValidationMessageFor(m => m.Employees[index].Values) 
    </div> 
} 

,并包括以下脚本

$('form').submit(function() { // use an id selector if you have added one to the form 
    var isValid = true; 
    var groups = $('.value-group'); 
    $.each(groups, function(index, item) { 
     var group = $(this); 
     var inputs = group.find('.value'); 
     if (inputs.filter(function() { return $(this).val().length > 0; }).length == 0) { 
      isValid = false; 
      group.find('span:last').append($('<span></span>').text('At least one value is required')).addClass('field-validation-error').removeClass('field-validation-valid'); 
     } 
    }); 
    return isValid; 
}); 

您可能还需要添加其他脚本来处理每个输入的更改事件以删除相关的错误消息,如果组中的任何输入现在具有值

+0

非常感谢。 – user1527762

0

Required验证只确保该属性具有值。在类似于List<string>的情况下,仅意味着它不为空。一个空的列表仍然是一个列表,所以它通过验证罚款。实际上,您使用的是RequiredIf,并且没有提供该自定义属性的实现,但我认为它基于Required属性,因为几乎所有我见过的实现都是这样。

总而言之,您需要修改您的RequiredIf实现来考虑列表和其他可枚举属性的内容,或者您​​需要添加一些手动验证来检查列表中是否至少有一个项目。

+0

是的,我检查清单上的计数,以确保计数> 0,这是服务器端。我'无法让客户端工作。 – user1527762