我正在尝试编写一个客户端验证所有复选框都已勾选的自定义验证器。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