在使用MVC4做项目的时候经常遇到需要验证,比如邮箱格式,电话号码格式等等。邮箱格式不必说了,全球才是统一的,微软也早就给了相应的验证方法。但是电话号码这类的每个国家都有不同的格式,微软肯定不会把这个内置的。
说到验证电话号码,在MVC的实体类中可以用到RegularExpression这个特性来验证
[RegularExpression(@"^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$|^[1][3,5,8][0-9]{9}$", ErrorMessage = "请输入正确的电话号码格式")] [Display(Name="手机号码")] public string CellPhoneNum { get; set; }
验证结果:
但是这个验证方法的问题你也发现了,假如我有好多地方都有这个手机号码的属性,那岂不是要把这么长的正则表达式拷贝来拷贝去的,万一有点毛病验证结果不正确,需要修改正则表达式,要一个一个找到,生怕有一个漏掉了,还要一个一个对比,万一已经改过了呢。。。
还好,我们可以扩展MVC的验证特性。
第一步,创建一个类,名字叫IsCellPhoneAttribute,继承验证特性的基类ValidationAttribute
/// <summary> /// 验证手机号码格式 /// </summary> [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public class IsCellPhoneAttribute : ValidationAttribute { public IsCellPhoneAttribute() : base("{0} 格式不正确!")//mark1 { } /// <summary> /// 重写验证方法 /// </summary> /// <param name="value"></param> /// <param name="validationContext"></param> /// <returns></returns> protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value != null) { var valueAsString = value.ToString(); const string regPattern = @"^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$|^[1][3,5,8][0-9]{9}$"; if (!Regex.IsMatch(valueAsString, regPattern)) { var errorMessage = FormatErrorMessage(validationContext.DisplayName);//格式化mark1处的验证信息的{0}占位符 显示的是属性的名称,如果你设置Display(Name="手机号码")那么显示的就是“手机号码” //var errorMessage = FormatErrorMessage(valueAsString);//如果想把号码显示出来,而不是字段名称,就把参数改成了传过来的手机号码 return new ValidationResult(errorMessage); } } return ValidationResult.Success; } }
这样的话,我们直接在实体类的CellPhoneNum属性直接加上这个特性就可以了
[IsCellPhone()] [Display(Name="手机号码")] public string CellPhoneNum { get; set; }
验证结果:
而且可以自定义错误信息,和原生的一些特性是一样的
[IsCellPhone(ErrorMessage="{0} 丫的格式根本不正确")] [Display(Name="手机号码")] public string CellPhoneNum { get; set; }
验证结果:
这样一来,我们就能举一反三,扩展出来自己项目中需要的验证扩展特性。
网站整体感觉不错
整的挺风骚啊