当前位置: 首页 > news >正文

本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善(转)...

本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善
namespace Web.Mvc.Extensions
{

    #region 验证基类
    /// <summary>
    /// 通用验证基类
    /// </summary>
    public abstract class EntityValidationAttribute : ValidationAttribute
    {
        #region Constructors
        public EntityValidationAttribute(MessageType messageId, params object[] args) :
            base(() => MessageManager.Current.GetMessage(messageId, args)) { }
        #endregion

        #region Protected Properties
        protected virtual Regex rLetters { get { return new Regex("[a-zA-Z]{1,}"); } }
        /// <summary>
        /// 验证数字
        /// 子类可以根据自己的逻辑去重写
        /// </summary>
        protected virtual Regex rDigit { get { return new Regex("[0-9]{1,}"); } }
        /// <summary>
        /// 验证邮编
        /// 子类可以根据自己的逻辑去重写
        /// </summary>
        protected virtual Regex rPostNumber { get { return new Regex("^[0-9]{3,14}$"); } }
        /// <summary>
        /// 验证手机
        /// 子类可以根据自己的逻辑去重写
        /// </summary>
        protected virtual Regex rMobile { get { return new Regex(@"^1[3|4|5|8][0-9]/d{8}$"); } }
        /// <summary>
        /// 验证电话
        /// 子类可以根据自己的逻辑去重写
        /// </summary>
        protected virtual Regex rTelePhone { get { return new Regex(@"^[0-9]{2,4}-/d{6,8}$"); } }
        /// <summary>
        /// 验证传真
        /// 子类可以根据自己的逻辑去重写
        /// </summary>
        protected virtual Regex rFex { get { return new Regex(@"/^[0-9]{2,4}-/d{6,8}$"); } }
        /// <summary>
        /// 验证Email
        /// 子类可以根据自己的逻辑去重写
        /// </summary>
        protected virtual Regex rEmail { get { return new Regex(@"^([/w-/.]+)@((/[[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.)|(([/w-]+/.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(/]?)$"); } }
        #endregion

    }
    #endregion

    #region 具体验证模块
    /// <summary>
    /// 为空验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class RequiredAttribute : EntityValidationAttribute
    {
        public bool AllowEmptyStrings { get; set; }
        public RequiredAttribute(MessageType messageType, params object[] args) :
            base(messageType, args)
        { }
        public override bool IsValid(object value)
        {
            return new System.ComponentModel.DataAnnotations.RequiredAttribute { AllowEmptyStrings = this.AllowEmptyStrings }.IsValid(value);
        }
    }
    /// <summary>
    /// 范围验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class RangeAttribute : EntityValidationAttribute
    {
        private System.ComponentModel.DataAnnotations.RangeAttribute innerRangeAttribute;

        public RangeAttribute(double minimum, double maximum, MessageType messageType, params object[] args) :
            base(messageType, args)
        {
            innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
        }

        public RangeAttribute(int minimum, int maximum, MessageType messageType, params object[] args) :
            base(messageType, args)
        {
            innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
        }

        public RangeAttribute(Type type, string minimum, string maximum, MessageType messageType, params object[] args) :
            base(messageType, args)
        {
            innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(type, minimum, maximum);
        }

        public override bool IsValid(object value)
        {
            return innerRangeAttribute.IsValid(value);
        }
    }

    /// <summary>
    /// Email验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class EmailAttribute : EntityValidationAttribute
    {
        public EmailAttribute(MessageType messageType, params object[] args) :
            base(messageType, args) { }
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;
            else
                return rEmail.IsMatch(value.ToString());
        }
    }

    /// <summary>
    /// 数值验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class DigitAttribute : EntityValidationAttribute
    {
        public DigitAttribute(MessageType messageType, params object[] args) :
            base(messageType, args) { }
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;
            else
                return rDigit.IsMatch(value.ToString());
        }

    }

    /// <summary>
    /// 邮编验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class PostNumberAttribute : EntityValidationAttribute
    {
        public PostNumberAttribute(MessageType messageType, params object[] args) :
            base(messageType, args) { }
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;
            else
                return rPostNumber.IsMatch(value.ToString());
        }

    }

    /// <summary>
    /// 手机验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class MobileAttribute : EntityValidationAttribute
    {
        public MobileAttribute(MessageType messageType, params object[] args) :
            base(messageType, args) { }
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;
            else
                return rMobile.IsMatch(value.ToString());
        }
    }

    /// <summary>
    /// 电话验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class TelePhoneAttribute : EntityValidationAttribute
    {
        public TelePhoneAttribute(MessageType messageType, params object[] args) :
            base(messageType, args) { }
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;
            else
                return rTelePhone.IsMatch(value.ToString());
        }
    }

    /// <summary>
    /// 传真验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class FexAttribute : EntityValidationAttribute
    {
        public FexAttribute(MessageType messageType, params object[] args) :
            base(messageType, args) { }
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;
            else
                return rFex.IsMatch(value.ToString());
        }
    }
    #endregion

    #region 验证消息返回类
    /// <summary>
    /// 消息类
    /// </summary>
    public class MessageManager
    {
        static Dictionary<MessageType, string> messages = new Dictionary<MessageType, string>();
        static MessageManager()
        {
            messages.Add(MessageType.RequiredField, "这个 /"{0}/"是必填的!");
            messages.Add(MessageType.GreaterThan, "这个 /"{0}/" 的值必须大于 /"{1}/"!");
            messages.Add(MessageType.LessThan, "这个 /"{0}/" 的值必须小于 /"{1}/"!");
            messages.Add(MessageType.EmailField, "这个 /"{0}/" 不是有效的Email地址!");
            messages.Add(MessageType.DigitField, "这个 /"{0}/" 不是有效的数字!");
            messages.Add(MessageType.PostNumberField, "这个 /"{0}/" 不是有效的邮编!");
            messages.Add(MessageType.MobileField, "这个 /"{0}/" 不是有效的手机号码!");
            messages.Add(MessageType.TelePhoneField, "这个 /"{0}/" 不是有效的电话号码!");
            messages.Add(MessageType.FexField, "这个 /"{0}/" 不是有效的传真!");
        }
        /// <summary>
        /// 得到验证异常的消息集合
        /// 对外公开
        /// </summary>
        /// <param name="messageType">异常消息ID</param>
        /// <param name="args">消息参数集合</param>
        /// <returns></returns>
        public string GetMessage(MessageType messageType, params object[] args)
        {
            return string.Format(CultureInfo.CurrentCulture, messages[messageType], args);
        }
        /// <summary>
        /// 本类的实例对象
        /// </summary>
        public static MessageManager Current = new MessageManager();
    }



    #endregion

    #region 验证类型枚举
    /// <summary>
    /// 验证消息类型
    /// </summary>
    public enum MessageType
    {
        /// <summary>
        /// 为空验证
        /// </summary>
        RequiredField,
        /// <summary>
        /// 大于验证
        /// </summary>
        GreaterThan,
        /// <summary>
        /// 小于验证
        /// </summary>
        LessThan,
        /// <summary>
        /// 邮箱验证
        /// </summary>
        EmailField,
        /// <summary>
        /// 数字验证
        /// </summary>
        DigitField,
        /// <summary>
        /// 邮编验证
        /// </summary>
        PostNumberField,
        /// <summary>
        /// 手机验证
        /// </summary>
        MobileField,
        /// <summary>
        /// 电话验证
        /// </summary>
        TelePhoneField,
        /// <summary>
        /// 传真验证
        /// </summary>
        FexField,
    }
    #endregion

}
完整的实体为:
  /// <summary>
    /// 人类实体
    /// </summary>
    public class Person
    {
        /// <summary>
        /// 姓名 
        /// </summary>
        [DisplayName("姓名"), Required(MessageType.RequiredField, "Name")]
        public string Name { get; set; }

        /// <summary>
        /// 年纪
        /// </summary>
        [DisplayName("年纪"), Range(18, int.MaxValue, MessageType.GreaterThan, "Age", 18)]
        public int Age { get; set; }

        /// <summary>
        /// 体重
        /// </summary>
        [DisplayName("体重"), Range(int.MinValue, 160, MessageType.LessThan, "Weight", 160)]
        public double Weight { get; set; }

        /// <summary>
        /// 电子邮件
        /// </summary>
        [DisplayName("电子邮件"), Email(MessageType.EmailField, "电子邮件")]
        public string Email { get; set; }

        /// <summary>
        /// 手机
        /// </summary>
        [DisplayName("手机"), Mobile(MessageType.MobileField, "Mobile")]
        public string Mobile { get; set; }

        /// <summary>
        /// 电话
        /// </summary>
        [DisplayName("电话"), TelePhone(MessageType.TelePhoneField, "TelePhone")]
        public string TelePhone { get; set; }

        /// <summary>
        /// 邮编
        /// </summary>
        [DisplayName("邮编"), PostNumber(MessageType.PostNumberField, "PostNumber")]
        public string PostNumber { get; set; }

        /// <summary>
        /// 传真
        /// </summary>
        [DisplayName("传真"), Fex(MessageType.FexField, "Fex")]
        public string Fex { get; set; }
    }

 

相关文章:

  • linux驱动编译常见错误记录
  • IT项目中存储设备的选型
  • 使用ASP.Net WebAPI构建REST服务(五)——客户端
  • CentOS Mahout部署
  • 软件设计的思想与哲学
  • VC中利用多线程技术实现线程之间的通信
  • 苹果平台上的媒体流播放技术HLS
  • 我的另外一个博客
  • Mod_Python中文文档
  • Radmin远程连接TMG
  • 自动化运维之 ~cobbler~
  • Hummer框架平台介绍
  • debian 7.4 安装配置
  • easy-ui 使用总结
  • ASP.NET MVC学习之视图篇(1)
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JavaScript 奇技淫巧
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS专题之继承
  • log4j2输出到kafka
  • Mac转Windows的拯救指南
  • markdown编辑器简评
  • npx命令介绍
  • Python学习之路16-使用API
  • QQ浏览器x5内核的兼容性问题
  • sessionStorage和localStorage
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 爬虫模拟登陆 SegmentFault
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • Python 之网络式编程
  • ​​​​​​​​​​​​​​Γ函数
  • #AngularJS#$sce.trustAsResourceUrl
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (SpringBoot)第七章:SpringBoot日志文件
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Mysql的优化设置
  • (转)mysql使用Navicat 导出和导入数据库
  • **PHP二维数组遍历时同时赋值
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理(一):@echo off
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net 后台导出excel ,word
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET上SQLite的连接
  • .ui文件相关
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @Async注解的坑,小心
  • @ConditionalOnProperty注解使用说明
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)