MVC4自定义验证扩展(一)

在使用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; }

验证结果:

这样一来,我们就能举一反三,扩展出来自己项目中需要的验证扩展特性。

上一篇‡: 浮云天气预报for Typecho

下一篇‡: MVC4自定义验证扩展(二)

最近回复