我正在嘗試編寫一個客戶端驗證所有複選框都已勾選的自定義驗證器。MVC客戶端列表的自定義驗證
這裏的模型上的聲明:
[DeclarationsAccepted(ErrorMessage = "You must tick all declarations")]
public IList<DeclarationQuestion> DeclarationQuestions { get; set; }
而這裏的屬性:
public class DeclarationsAccepted : ValidationAttribute, IClientValidatable
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var questions = value as IList<DeclarationQuestion>;
if (questions != null && questions.All(c => c.Answer))
{
return ValidationResult.Success;
}
return new ValidationResult("You must accepted all declarations to continue");
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var modelClientValidationRule = new ModelClientValidationRule
{
ValidationType = "declarationsaccepted",
ErrorMessage = FormatErrorMessage(metadata.DisplayName)
};
yield return modelClientValidationRule;
}
}
到目前爲止好,做工服務器端。
對於我佈線這件事作爲客戶端如下:
jQuery.validator.addMethod('declarationsaccepted', function (value, element, params) {
//Implement logic here to check all boxes are ticked
console.log(value);
return false;
}, '');
jQuery.validator.unobtrusive.adapters.add('declarationsaccepted', {}, function (options) {
options.rules['declarationsaccepted'] = true;
options.messages['declarationsaccepted'] = options.message;
});
我顯示覆選框這樣的:
@{ var questionIndex = 0; }
@foreach (var question in Model.DeclarationQuestions)
{
@Html.CheckBoxFor(model => Model.DeclarationQuestions[questionIndex].Answer, new { id = "DeclarationQuestions" + questionIndex})
questionIndex++;
}
然後顯示使用該驗證消息:
@Html.ValidationMessageFor(c => c.DeclarationQuestions)
當我提交表單時,消息會顯示出來,但只有在回發到服務器後纔會顯示。有沒有什麼辦法可以讓客戶端工作?
任何驗證工作的客戶端?如果不是,你需要包含jquery.validate.js和jquery.validate.unobtrusive.js。 – KevDevMan 2015-03-13 15:55:20
是驗證在客戶端工作,我可以將該屬性應用於其他屬性,例如一個文本輸入。 – 2015-03-13 16:11:22