public class MyMaxLengthAttribute : ValidationAttribute { private readonly int MaxLength; public MyMaxLengthAttribute(int maxLength) { MaxLength = maxLength; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { string content = value.ToString(); if (content.Length > MaxLength) { return new ValidationResult("输入的字符太多了!^_^"); } return ValidationResult.Success; //return base.IsValid(value, validationContext); } 第二步就是像正常使用asp.net自带的数据注解一样使用,如:[Required(ErrorMessageResourceType=typeof(ErrorMessage),ErrorMessageResourceName="UserRequire")] [Display(Name = "用户名")] [MyMaxLengthAttribute(10)] [Remote("CheckUserName","Account", HttpMethod="POST")] public string UserName { get; set; } 好了,只需要这样简单的两步就可以实现了。验证结果: 对于自定义的数据注解由于是继承于System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute类,所以它的一些属性也可以使用,比如ErrorMessage,如:[Required(ErrorMessageResourceType=typeof(ErrorMessage),ErrorMessageResourceName="UserRequire")] [Display(Name = "用户名")] [MyMaxLengthAttribute(10,ErrorMessage="{0}字数太多")] [Remote("CheckUserName","Account", HttpMethod="POST")] public string UserName { get; set; } 需要注意的是,自定义的数据注解不支持客户端验证,所有的数据需要提交之后再服务端验证,所以如果要同时实现客户端验证需要自己写js验证。 但是这样的验证有一个问题,就是默认的验证信息不能实现直接显示Display Name,所以需要如下更改:public class MyMaxLengthAttribute : ValidationAttribute { private readonly int MaxLength; public MyMaxLengthAttribute(int maxLength ):base("{0}的字符太多了!") { MaxLength = maxLength; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { string content = value.ToString(); if (content.Length > MaxLength) { //return new ValidationResult("输入的字符太多了!^_^"); string errorMessage = FormatErrorMessage(validationContext.DisplayName); return new ValidationResult(errorMessage); } return ValidationResult.Success; //return base.IsValid(value, validationContext); } } 验证结果: 二、自定义Model级别的验证(IValidatableObject) 这个接口是为了实现Model的自验证(self-validating)的,是asp.net mvc3 新增的验证特性。这个特性和普通数据注解的区别是普通数据注解仅仅只能验证Model的一个属性,而实现了IValidatableObject接口的自验证则在Model的级别来验证,比如验证Model的几个属性之间的关系等。 例如,我要验证两次输入的密码相同(好吧,我又把系统自带的验证再写一遍)。 (1)首先,要将需要验证的Model实现IValidatableObject接口。 public class RegisterModel : IValidatableObject (2)在Model中实现Validate方法:public IEnumerable<ValidationResult> Validate(ValidationContext validationContent) { if (PassWord != ConfirmPassword) { yield return new ValidationResult("两次输入的密码不同!", new[] { "Password" }); } }这个方法在提交Model时会自动验证两次输入的密码是否相同,如果不同则会提示,如下: 注意:1、自验证只能把方法写在需要验证的Model中,所以这种自验证的代码无法重用; 2、自验证的返回值是IEnumerable<ValidationResult>,而不是ValidationResult,所以返回值可以不止一个验证错误。 3、Validate方法没有传入value参数,也就是意味着Validate方法可以直接访问Model中的属性值。 4、返回值使用的是yield return来构建枚举返回值,第二个参数是指定错误信息绑定的属性,因为是string数组,所以可以关联多个属性。
最后附上常用正则表达式
数字:"^[0-9]*$"。
n位的数字:"^/d{n}$"。
至少n位的数字:"^/d{n,}$"。
m~n位的数字:。"^/d{m,n}$"
零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
非零的正整数:"^/+?[1-9][0-9]*$"。
非零的负整数:"^/-[1-9][]0-9"*$。
长度为3的字符:"^.{3}$"。
由26个英文字母组成的字符串:"^[A-Za-z]+$"。
由26个大写英文字母组成的字符串:"^[A-Z]+$"。
由26个小写英文字母组成的字符串:"^[a-z]+$"。
由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
由数字、26个英文字母或者下划线组成的字符串:"^/w+$"。
验证用户密码:"^[a-zA-Z]/w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
验证是否含有^%&’,;=?$/"等字符:"[^%&’,;=?$/x22]+"。
只能输入汉字:"^[/u4e00-/u9fa5]{0,}$"
验证Email地址:"^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$"。
验证InternetURL:"^http://([/w-]+/.)+[/w-]+(/[/w-./?%&=]*)?$"。
验证电话号码:"^(/(/d{3,4}-)|/d{3.4}-)?/d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
验证身份证号(15位或18位数字):"^/d{15}|/d{18}$"。
验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
新闻热点
疑难解答