MVC 添加自定义 Client Validation javascript 支持
DataAnnotations.ValidationAttribute 提供以下几种
StringLength, Required, RegularExpression, Range 和 DataType
当在 View 里启用 ClientValidation (Html.EnableClientValidation) 时,可以看见输出的 js 里只包含以上几种 ValidationType ,自定义的 ValidateionAttribute 在输出的JS里没有对应的
ValidationType
这需要我们自己添加,具体可参考:
下面来实现一下:
1, 定义ValidationAttribute, 原生的 ValidationAttribute 提供了一个 StringLength ,但是只能限定最大长度,这里我添加最小长度和是否 trim
public sealed class StringLengthRangeAttribute : ValidationAttribute {
public int Max {get; private set;}
public int Min {get; private set;}
public bool Trim {get; private set;}
public StringLengthRangeAttribute( int min, int max ) : base() {
Max = Math.Max(min, max);
Min = Math.Min(min, max);
}
public StringLengthRangeAttribute(int min, int max, bool trim) : base( ) {
Max = Math.Max(min , max);
Min = Math.Min(min , max);
Trim = trim;
}
public override bool IsValid(object value) {
if (value == null) return false;
string v = Trim ? ((string)value).Trim() : (string)value;
if( v.Length < Min || v.Length > Max ) {
return false;
} else
return true;
}
public override string FormatErrorMessage(string name) {
return ErrorMessage;
}
}
2, 定义 DataAnnotationsModelValidator
public class StringLengthRangeValidator : DataAnnotationsModelValidator<StringLengthRangeAttribute> {
private int max, min;
private bool trim;
private string errMsg;
public StringLengthRangeValidator(ModelMetadata metaData, ControllerContext ctx, StringLengthRangeAttribute att)
: base(metaData, ctx, att) {
max = att.Max;
min = att.Min;
trim = att.Trim;
errMsg = att.ErrorMessage;
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
ModelClientValidationRule rule = new ModelClientValidationRule { ErrorMessage = errMsg, ValidationType = "StringLengthRange" };
rule.ValidationParameters.Add("min", min);
rule.ValidationParameters.Add("max", max);
rule.ValidationParameters.Add("trim", trim);
return new[] { rule };
}
}
这个时候, HTML 里输出的 js 里就会多出类似:
{"ErrorMessage":"Password length must between 6 and 16." , "ValidationParameters":{"min":6,"max":16,"trim":false} , "ValidationType":"StringLengthRange"}
3, 注册, 修改 Global.asax.cs 文件, 在 Application_Start 里加上:
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(StringLengthRangeAttribute), typeof(StringLengthRangeValidator));
4, 写个 js 文件,包含以下内容,并将这个 js 文件引用
if(String.trim != null)
String.prototype.trim = function() {return this.replace(/(^\s*)|(\s*$)/g, "");}
Sys.Mvc.ValidatorRegistry.validators["StringLengthRange"] = function(rule) {
var min = rule.ValidationParameters["min"];
var max = rule.ValidationParameters["max"];
var trim = rule.ValidationParameters["trim"];
return function(value, context) {
if (trim)
value = value.trim();
var len = value.length;
if (len < min || len > max)
return rule.ErrorMessage;
else
return true;
}
}
OK,就是这么一个流程。