ASP.NET MVC unobtrusive客户端自定义验证

unobtrusive

ASP.NET MVC 对于model属性的验证分为客户端和服务端的验证,客户端的验证则是使用jquery validate来进行验证。可以发现需要验证的控件它的HTML代码生成后会有一些以data-val-为前缀属性,如:

<input type="text" name="Name" id="Name" data-val-required="姓名 字段是必需的。" data-val="true"/>

 

data-val="true"表示对用户输入的值进行验证,其它以data-val-为前缀的属性用来设置验证的规则和与其相关的属性。data-val-required表示非空验证,data-val-number表示该项只能输入数字。可以看到后面的规则名称跟jquery validate是一致的。jquery validate默认校验规则:
1. required 必输字段
2. equalTo:"#field" 输入值必须和#field相同
3. email 必须输入正确格式的电子邮件
4. url 必须输入正确格式的网址
5. date 必须输入正确格式的日期
6. creditcard: 必须输入合法的信用卡号

然而不同的是ASP.NET MVC 在validate的基础上套了一层。 通过引入jquery.validate.unobtrusive.js文件就能解析data-val-后面属性的含义。

IClientValidatable

通过IClientValidatable接口就可以返回添加了data-val的自定义属性,它返回的类型是ModelClientValidationRule

public class ModelClientValidationRule
    {
        //不能通过验证要显示错误提示
        public string ErrorMessage { get; set; }
       
        //最终要生成的属性就是通过这个属性注册的
        public IDictionary<string, object> ValidationParameters { get; }

        //自定义验证规则的名称
        public string ValidationType { get; set; }
    }

 

 比如下面是一个验证输入的值不能和某个特定值相等的验证规则

public class NotEqualAttribute : ValidationAttribute, IClientValidatable
    {
        public NotEqualAttribute(string NotEqualValue)
        {
            this.NotEqualValue = NotEqualValue;
        }

        public override string FormatErrorMessage(string name)
        {
            return string.Format("{0}不能够等于 {1}",name,NotEqualValue);
        }
        public string NotEqualValue { get;private set; }
        public IEnumerable<ModelClientValidationRule> 
               GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var validationRule = new ModelClientValidationRule
            {
            ErrorMessage=FormatErrorMessage(metadata.DisplayName),
            ValidationType="notequal",
            };
            validationRule.ValidationParameters.Add("value", NotEqualValue);

            yield return validationRule;
        }
    }

 所有的验证都要继承ValidationAttribute这个特性类,可以重写IsValid方法来做服务器端的验证

 

public class Person
    {
        [DisplayName("姓名")]
        [Required] 
        [NotEqual("abcd")]
        public string Name { get; set;}
    }

 

最终页面得到的HTML代码如下

<input type="text" value="" name="Name" id="Name" data-val-required="姓名 字段是必需的。"
 data-val-notequal-value="abcd" data-val-notequal="姓名不能够等于 abcd" data-val="true" class="text-box single-line">

注册客户端验证

 最后需要在客户端添加js代码还进行输入是否合法性的验证工作,代码如下

$.validator.addMethod('notequal', function (value, element, params) {
    return value != params['value'];
});

$.validator.unobtrusive.adapters.add("notequal", ['value'], function (options) {
    options.rules["notequal"] = {
        value:options.params.value
    };
    options.messages["notequal"] = options.message;
});

 

我想上面一段应该是向客户端添加验证的逻辑,下面一段应该是给相关的参数赋值,赋值分为两部分:1.给rule添加参数 2.给message添加提示信息

[代码下载]

posted @ 2012-09-23 22:05  叶de第柒章  阅读(9795)  评论(8编辑  收藏  举报