2011-05-31 58 views
3

我實現一個自定義的驗證器來檢查是否有至少東西檢查:ASP.NET MVC 3.0驗證MVCContrib的CheckBoxList

public class AtLestOneRequiredAttribute : RequiredAttribute 
    { 
     public override bool IsValid(object value) 
     { 
      return (value != null); 
     } 
    } 

    public class RequiredListValidator : DataAnnotationsModelValidator<AtLestOneRequiredAttribute> 
    { 
     private readonly string errorMessage; 

     /// <summary> 
     /// Initializes a new instance of the <see cref="EmailValidator"/> class. 
     /// </summary> 
     /// <param name="metadata">The metadata.</param> 
     /// <param name="context">The context.</param> 
     /// <param name="attribute">The attribute.</param> 
     public RequiredListValidator(ModelMetadata metadata, ControllerContext context, AtLestOneRequiredAttribute attribute) 
      : base(metadata, context, attribute) 
     { 
      this.errorMessage = attribute.ErrorMessage; 
     } 

     /// <summary> 
     /// Retrieves a collection of client validation rules. 
     /// </summary> 
     /// <returns>A collection of client validation rules.</returns> 
     public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
     { 
      var rule = new ModelClientValidationRule 
      { 
       ErrorMessage = errorMessage, 
       ValidationType = "atlestonerequired" 
      }; 

      return new[] { rule }; 
     }   
    } 

我也產生不引人注目的驗證特性對於選擇(http://weblogs.asp.net/srkirkland/archive/2011/03/08/adding-unobtrusive-validation-to-mvccontrib-fluent-html.aspx

型號:

[AtLestOneRequired(ErrorMessage="At least one selection required")] 
     public IList<int> MyCheckBox{ get; set; } 

查看:

@this.CheckBoxList(x => x.MyCheckBox).Options(Model.MyCheckBoxes).IncludeUnobtrusiveValidationAttributes(Html) 

在結果我得到這個網站在不顯眼的屬性:

<div data-val="true" data-val-atlestonerequired="At least one selection required" id="MyCheckBox"> 
    <input id="MyCheckBox_0" name="MyCheckBox" type="checkbox" value="1"/> 
    <label for="MyCheckBox_0" id="MyCheckBox_0_Label">A</label> 
    <input id="MyCheckBox_1" name="MyCheckBox" type="checkbox" value="2"/> 
    <label for="MyCheckBox_1" id="MyCheckBox_1_Label">B</label> 
    <input id="MyCheckBox_2" name="MyCheckBox" type="checkbox" value="3"/> 
    <label for="MyCheckBox_2" id="MyCheckBox_2_Label">C</label> 
    <input id="MyCheckBox_3" name="MyCheckBox" type="checkbox" value="4"/> 
    <label for="MyCheckBox_3" id="MyCheckBox_3_Label">D</label> 
    .... 
</div> 

但我validaton不會對客戶端的工作,什麼是我需要做的,使其工作?我想可能是我需要實現自定義jQuery validaton方法在這種情況下,如果默認情況下它不工作?

想補充一點:

jQuery.validator.addMethod("atlestonerequired", function (value, element) { 
      return (value != null); 
     }); 

     jQuery.validator.unobtrusive.adapters.addBool('atlestonerequired'); 

不起作用。

+0

我想知道答案,就一個? :( – Maidot 2011-06-01 01:26:22

+0

我也在尋找相同的解決方案! – imdadhusen 2011-10-18 13:47:36

回答

0

我不知道這個問題的可接受的解決方案。但這是一個解決它的方法。

我有複選框爲:

<input name="TermsNConditions" type="checkbox" id="TermsNConditions" tabindex="12" /> 

該模型具有這個屬性:

[Required(ErrorMessage = "(Please accept the terms and conditions)")] 
    [DefaultValue(0)] 
    [RegularExpression(@"[^0]", ErrorMessage = "(Please accept the terms and conditions)")] 
    public int AcceptTermsNConditions { get; set; } 

和一個隱藏字段爲它

<%:Html.HiddenFor(model=>model.AcceptTermsNConditions) %> 

我調用JavaScript更改事件複選框如下:

$(function() { 
     $("#TermsNConditions").live("change", function() { 
      if ($("#TermsNConditions").attr('checked')) { 
       $("#AcceptTermsNConditions").val(1); 
      } 
      else { 
       $("#AcceptTermsNConditions").val(0); 
      } 
     }); 
     if ($("#AcceptTermsNConditions").val() == 1) { 
      $("#TermsNConditions").attr('checked', true); 
     } 
    }); 

上述腳本設置隱藏字段的值,並根據該隱藏字段驗證模型。

1

在這個問題上花了一些時間。 客戶端驗證不起作用的原因是不引人注意的驗證選擇需要驗證的項目的方式。特別是以下行:

$(selector).find(":input[data-val=true]").each(function() { 
    $jQval.unobtrusive.parseElement(this, true); 
}); 

如果您發現該「:輸入」只適用於input|select|textarea|button

這意味着你的"div[data-val=true]"不會被選中。

解決此問題的方法是執行類似於單選按鈕的必需。

<div name="CheckBox" id="CheckBox"> 
    <input type="checkbox" data-val-cbrequired="Required" data-val="true" value="Default" name="CheckBox_0" id="CheckBox_0"> 
    <label for="CheckBox_0">Checkbox</label> 
    <input type="checkbox" value="Yes" name="CheckBox_1" id="CheckBox_1"> 
    <label for="CheckBox_1">Yes</label> 
    <input type="checkbox" value="No" name="CheckBox_2" id="CheckBox_2"> 
    <label for="CheckBox_2">No</label> 
</div> 

然後爲jQuery驗證補充:

$.validator.unobtrusive.adapters.addBool("cbrequired", "required");