狮王

导航

MVC 添加自定义 Client Validation javascript 支持

DataAnnotations.ValidationAttribute 提供以下几种

StringLength, Required, RegularExpression, Range 和 DataType
 
当在 View 里启用 ClientValidation (Html.EnableClientValidation) 时,可以看见输出的 js 里只包含以上几种 ValidationType ,自定义的 ValidateionAttribute 在输出的JS里没有对应的 
 
ValidationType
 
这需要我们自己添加,具体可参考:
http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx
 
下面来实现一下:
 
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,就是这么一个流程。

posted on 2010-12-02 12:39  狮王  阅读(528)  评论(0编辑  收藏  举报