2012-12-01 17 views
1

我只是列出複選框,選擇語言的開發人員才華橫溢。我想驗證至少必須選擇一種語言。無法獲得它的工作客戶端驗證IEnumerable <T>在MVC3

服務器端驗證工作沒有失敗。但是我一直無法得到它在客戶端工作。 即使「GetClientValidationRules」方法從未稱爲。這就是我好奇的一點。

是否IEnumerable不支持客戶端驗證?這樣做的方式是什麼?

PS:我neednt把JS驗證碼,因爲我認爲這將是一次OK GetClientValidationRules被稱爲

查看:(簡化爲簡潔起見)

public class DeveloperViewModel 
{   
    [DeveloperLanguageSelectOneValidation(ErrorMessage="Please check at least one lang")] 
    public IEnumerable<SelectListItem> LanguagesModel { get; set; } 

} 

驗證:

public class DeveloperLanguageSelectOneValidationAttribute : ValidationAttribute ,IClientValidatable 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     IEnumerable<SelectListItem> items = (IEnumerable<SelectListItem>)value; 
     foreach (var item in items) 
      if (item.Selected) 
       return ValidationResult.Success; 
     return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
    } 

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

     return new[] { rule }; 
    } 
} 

SelectListItem查看:

@model SelectListItem 
<li> 
    @Html.HiddenFor(a => a.Value) 
    @Html.CheckBoxFor(a => a.Selected) 
    @Html.DisplayFor(a => a.Text) 
</li> 

開發人員查看:

<ul> 
     @Html.EditorFor(a => a.LanguagesModel)</ul> 
    @Html.ValidationMessageFor(a => a.LanguagesModel) 

回答

0

關於使用jQuery如何?

$.validator.addMethod('require-one', function(value) { 
    return $('.require-one:checked').size() > 0; 
}, 'Please check at least one box.'); 

var checkboxes = $('.require-one'); 
var checkbox_names = $.map(checkboxes, function(e, i) { 
    return $(e).attr("name") 
}).join(" "); 

$("#itemForm").validate({ 
    groups: { 
     checks: checkbox_names 
    }, 
    errorPlacement: function(error, element) { 
     if (element.attr("type") == "checkbox") error.insertAfter(checkboxes.last()); 
     else error.insertAfter(element); 
    } 
}); 

您的形式:

<form name="itemForm" id="itemForm" method="post"> 

<label for="checkbox1">checkbox1</label> 
<input checked="checked" data-val="true" data-val-required="The checkbox1 field is required." id="checkbox1" name="checkbox1" type="checkbox" value="true" class="require-one" /> 
<input name="checkbox1" type="hidden" value="false" /><br /> 

<label for="checkbox2">checkbox2</label> 
<input checked="checked" data-val="true" data-val-required="The checkbox2 field is required." id="checkbox2" name="checkbox2" type="checkbox" value="true" class="require-one" /> 
<input name="checkbox2" type="hidden" value="false" /><br /> 

<label for="checkbox3">checkbox3</label> 
<input checked="checked" data-val="true" data-val-required="The checkbox3 field is required." id="checkbox3" name="checkbox3" type="checkbox" value="true" class="require-one" /> 
<input name="checkbox3" type="hidden" value="false" /><br /> 

<input type="submit" /> 
</form> 

來源:https://stackoverflow.com/a/11512622/1026898

+0

感謝reply.Is有任何機會來解決這個驗證在不顯眼的方式? – sercan