您的位置:首页 > 编程语言 > ASP

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

2012-09-23 22:05 701 查看

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添加提示信息



[代码下载]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: