浑水~摸鱼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

带了几个同事一块儿做项目,在发布信息时,会有些验证,比如非空,邮箱,手机号码之类。当然我们最原始的做法就是一个一个判断,去验证是否符合我们的要求。

但是这样问题就来了,我们会发现按钮事件里面的if简直是一个挨着一个。如下图 简直惨不忍睹啊:

if (GetQueryString("SaleStartDate") != "" &&Strtime(GetQueryString("SaleStartDate").ToString())==true)
            {
                fp.SaleStartDate = DateTime.Parse(GetQueryString("SaleStartDate").ToString());
            }
            if (GetQueryString("SaleEndDate") != "" && Strtime(GetQueryString("SaleEndDate").ToString()) == true)
            {
                fp.SaleEndDate = DateTime.Parse(GetQueryString("SaleEndDate").ToString());
            }
            if (GetQueryString("IncomeStartData") != "" && Strtime(GetQueryString("IncomeStartData").ToString()) == true)
            {
                fp.IncomeStartData = DateTime.Parse(GetQueryString("IncomeStartData").ToString());
            }
            if (GetQueryString("IncomeEndData") != "" && Strtime(GetQueryString("IncomeEndData").ToString()) == true)
            {
                fp.IncomeEndData = DateTime.Parse(GetQueryString("IncomeEndData").ToString()); 
            }
            if (GetQueryString("IncomeRateL") != "")
            {
                fp.IncomeRateL = decimal.Parse(GetQueryString("IncomeRateL").ToString());
            }
            if (GetQueryString("IncomeRateH") != "")
            {
                fp.IncomeRateH = decimal.Parse(GetQueryString("IncomeRateH").ToString()); 
            }
            if (GetQueryString("IncomeCalculation")!="")
            {
                fp.IncomeCalculation = GetQueryString("IncomeCalculation");
            }
            if (GetQueryString("SceneAnalysis")!="")
            {
                fp.SceneAnalysis = GetQueryString("SceneAnalysis");
            }
            if (GetQueryString("Note")!="")
            {
                fp.Note = GetQueryString("Note");
            }

哈哈,这让我想起来我以前刚开始做的时候,写代码也是这么过来的!但是一个好的代码我觉得不应该是这样的,不只是前台要验证后台也要验证。于是我想到了封装一下验证。

先看下封装完后的用法,是不是简洁了很多呢:

 ControlVerify Verify = new ControlVerify();
            Verify.ControlList.Add(new ControlNeedVerify(this.txtBox, VerifyType.IntNumber, "固定电话", false));
            Verify.ControlList.Add(new ControlNeedVerify(this.txtTest, VerifyType.Email, "Email", false));
            Verify.ControlList.Add(new ControlNeedVerify(this.txtMobile, VerifyType.Mobile, "手机号码", false));
            Verify.ControlList.Add(new ControlNeedVerify(this.textArea, VerifyType.WordCount, "简介", false,"20"));
            //开始验证
            Verify.VerifyValue();
            //取第一个错误
            string ErrFirst = Verify.FirstErrorMsg;

            //取所有错误
            if (Verify.HasError)
            {
                foreach (string err in Verify.ErrorList)
                {
                    Response.Write(err+"<br>");
                }
            }

首先把验证类型分下类:

// 吴亚宾 2011-03-31
    // QQ:395088970

    /// <summary>
    /// 需要验证的类型枚举
    /// </summary>
    /// 手机号 Mobile 
    /// 固定电话 TelPhone 
    /// 邮箱 Email
    /// 身份证号 IdCard
    /// 数字 Number
    /// 邮编 PostalCode
    /// 忽略此验证类型 Ignore
    /// 比较两个值Equal 
    /// 字数 WordCount
    /// Ip地址 IpAddress
    /// 日期时间DateTime
    /// 网址 url
    /// 正常字符串 NormalChar
    /// 是否为中文 IsChinese
    public enum VerifyType { Mobile, TelPhone, Email, IdCard, IntNumber, PostalCode, Ignore, Equal, WordCount, IpAddress, DateTime, Url, NormalChar,IsChinese};

我大概分了这几类,基本上已经涵盖了我们常用的方法了。下面是个验证信息存储类,用来存储我们的控件和相应的验证信息

    #region 验证信息存储类 ControlNeedVerify
    /// <summary>
    /// 验证信息存储类
    /// </summary>
    public class ControlNeedVerify
    {
        /// <summary>
        /// 4参数的构造函数
        /// </summary>
        /// <param name="control">需要验证的控件</param>
        /// <param name="type">所要验证的类型</param>
        /// <param name="errMsg">错误时所提示的信息</param>
        /// <param name="IsCanempty">是否允许为空</param>
        public ControlNeedVerify(Control control,VerifyType type,string Msg,Boolean IsCanempty)
        {
            this.verifyControl = control;
            this.vType = type;
            this.errorMsg = Msg;
            this.isCanEmpty = IsCanempty;
        }

        /// <summary>
        /// 5参数的构造函数 用在是否同 比较类型
        /// </summary>
        /// <param name="control">需要验证的控件</param>
        /// <param name="type">所要验证的类型</param>
        /// <param name="errMsg">错误时所提示的信息</param>
        /// <param name="IsCanempty">是否允许为空</param>
        /// <param name="Parm">额外参数提供相等以及字数验证需要</param>
        public ControlNeedVerify(Control control, VerifyType type, string Msg, Boolean IsCanempty,string Parm)
        {
            this.verifyControl = control;
            this.vType = type;
            this.errorMsg = Msg;
            this.isCanEmpty = IsCanempty;
            this.parameter = Parm;
        }

        private Control verifyControl;
        /// <summary>
        /// 需要验证的控件
        /// </summary>
        public Control VerifyControl
        {
            get { return this.verifyControl; }
            set { verifyControl = value; }
        }

        private VerifyType vType;
        /// <summary>
        /// 需要验证的类型
        /// </summary>
        public VerifyType VType
        {
            get { return this.vType; }
            set { this.vType = value; }
        }

        private string errorMsg;
        /// <summary>
        /// 错误信息标识
        /// </summary>
        public string ErrorMsg
        {
            get { return this.errorMsg; }
            set { this.errorMsg = value; }
        }

        private Boolean isCanEmpty;
        /// <summary>
        /// 是否可以为空 true表示可以 false 表示不可以
        /// </summary>
        public Boolean IsCanEmpty
        {
            get { return this.isCanEmpty; }
            set { this.isCanEmpty = value; }
        }

        private string parameter;
        /// <summary>
        /// 额外的参数 用于比较或者长度限制类型
        /// </summary>
        public string Parameter
        {
            get { return this.parameter; }
            set { this.parameter = value; }
        }
    }

    #endregion

下面是我们的验证类ControlVerify:

/// <summary>
    /// 验证类
    /// </summary>
    public class ControlVerify
    {
        /// <summary>
        /// 需要验证的控件集合
        /// </summary>
        public List<ControlNeedVerify> ControlList = new List<ControlNeedVerify>();
       /// <summary>
       /// 错误列表
       /// </summary>
        public List<string> ErrorList = new List<string>();
        /// <summary>
        /// 是否有错误
        /// </summary>
        public Boolean HasError
        {
            get { return this.ErrorList.Count>0; }
        }

        /// <summary>
        /// 获取第一个错误
        /// </summary>
        public string FirstErrorMsg
        {
            get { return HasError? this.ErrorList[0] : String.Empty; }
        }

        #region 开始验证值 根据不同控件来分类
        /// <summary>
        /// 开始验证值 根据不同控件来分类
        /// </summary>
        public void VerifyValue()
        {
            foreach (ControlNeedVerify CurrentControl in ControlList)
            {
                string type = CurrentControl.VerifyControl.GetType().Name;
                switch (type)
                {
                    case "TextBox":
                        TextBox Box = CurrentControl.VerifyControl as TextBox;
                        if (!CurrentControl.IsCanEmpty)
                        {
                            Boolean hasError = IsEmpty(Box.Text.Trim());
                            if (hasError)
                                ErrorList.Add(CurrentControl.ErrorMsg + "不能为空!");
                        }
                        this.CheckByType(Box.Text.Trim(), CurrentControl);
                        break;
                    case "HtmlInputText":
                        HtmlInputText InputBox = CurrentControl.VerifyControl as HtmlInputText;
                        if (!CurrentControl.IsCanEmpty)
                        {
                            Boolean hasError = IsEmpty(InputBox.Value.Trim());
                            if (hasError)
                                ErrorList.Add(CurrentControl.ErrorMsg + "不能为空!");
                        }
                        this.CheckByType(InputBox.Value.Trim(), CurrentControl);
                        break;
                    case "HtmlTextArea":
                        HtmlTextArea InputArea = CurrentControl.VerifyControl as HtmlTextArea;
                        if (!CurrentControl.IsCanEmpty)
                        {
                            Boolean hasError = IsEmpty(InputArea.Value.Trim());
                            if (hasError)
                                ErrorList.Add(CurrentControl.ErrorMsg + "不能为空!");
                        }
                        this.CheckByType(InputArea.Value.Trim(), CurrentControl);
                        break;
                }
            }
        }
        #endregion

        #region 根据验证类型来最终验证控件值
        /// <summary>
        /// 根据验证类型来最终验证控件值
        /// </summary>
        /// <param name="txt"></param>
        /// <param name="Control"></param>
        /// <returns></returns>
        private Boolean CheckByType(string txt, ControlNeedVerify Control)
        {
            Boolean IsSccess = false;
            //是否为正常验证
            Boolean IsCommon = true;
            switch (Control.VType)
            { 
                case VerifyType.Email:
                    IsSccess = IsEmail(txt);
                    break;
                case VerifyType.Mobile:
                    IsSccess =IsMobile(txt);
                    break;
                case VerifyType.IntNumber:
                    IsSccess = IsNumber(txt);
                    break;
                case VerifyType.PostalCode:
                    IsSccess = IsPostalCode(txt);
                    break;
                case VerifyType.IdCard:
                    IsSccess = IsIDcard(txt);
                    break;
                case VerifyType.TelPhone:
                    IsSccess = IsTelephone(txt);
                    break;
                case VerifyType.IpAddress:
                    IsSccess = IsIP(txt);
                    break;
                case VerifyType.DateTime:
                    IsSccess = IsDateTime(txt);
                    break;
                case VerifyType.NormalChar:
                    IsSccess = IsNormalChar(txt);
                    break;
                case VerifyType.IsChinese:
                    IsSccess=IsChinese(txt);
                    break;
                case VerifyType.Url:
                    IsSccess = IsUrl(txt);
                    break;
                case VerifyType.WordCount:
                    IsSccess = IsLenthThen(txt, Int32.Parse(Control.Parameter));
                    if (!IsSccess)
                    {
                        IsCommon = false;
                        ErrorList.Add(Control.ErrorMsg + "字数不能超过"+Control.Parameter+"个!");
                    }
                    break;
                case VerifyType.Equal:
                    IsSccess=IsEqual(txt, Control.Parameter);
                    if (!IsSccess)
                    {
                        IsCommon = false;
                        ErrorList.Add(Control.ErrorMsg + "两次输入不一样!");
                    }
                    break;
                default:
                    IsSccess = true;
                    break;
            }
            if (!IsSccess&&IsCommon)
            {
                ErrorList.Add(Control.ErrorMsg + "格式不正确!");
            }
            return IsSccess;
        }
        #endregion

        #region 验证函数集合
        /// <summary>
        /// 验证是不是正常字符 字母,数字,下划线的组合
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static Boolean IsNormalChar(string source)
        {
            return Regex.IsMatch(source, @"[\w\d_]+", RegexOptions.IgnoreCase);
        }
        /// <summary>
        /// 验证网址
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static Boolean IsUrl(string txt)
        {
            return Regex.IsMatch(txt, @"^(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(www\.))+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9\&%_\./-~-]*)?$", RegexOptions.IgnoreCase);
        }
         /// <summary>
         /// 是否为IP地址
         /// </summary>
         /// <param name="source"></param>
         /// <returns></returns>
        public static Boolean IsIP(string txt)
         {
             return Regex.IsMatch(txt, @"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$", RegexOptions.IgnoreCase);
         }
        /// <summary>
        /// 验证日期
        /// </summary>
        /// <param name="txt"></param>
        /// <returns></returns>
        public static Boolean IsDateTime(string txt)
        {
            DateTime time;
            return DateTime.TryParse(txt, out time);
        }
        /// <summary>
        /// 验证中文
        /// </summary>
        /// <param name="txt"></param>
        /// <returns></returns>
        public static Boolean IsChinese(string txt)
        {
            return Regex.IsMatch(txt, @"^[\u4e00-\u9fa5]+$", RegexOptions.IgnoreCase);
        }

        /// <summary>
        /// 验证两值是否相等
        /// </summary>
        /// <param name="txt"></param>
        /// <returns></returns>
        public static Boolean IsEqual(string txt, string str)
        {
            return txt.Equals(str);
        }

        /// <summary>
        /// 验证字数
        /// </summary>
        /// <param name="txt"></param>
        /// <returns></returns>
        public static Boolean IsLenthThen(string txt, int len)
        {
            return txt.Length <len;
        }
        /// <summary>
        /// 验证非空
        /// </summary>
        /// <param name="txt"></param>
        /// <returns></returns>
        public static Boolean IsEmpty(string txt)
        {
            return txt.Length == 0;
        }
        /// <summary>
        /// 验证手机格式是否正确
        /// </summary>
        /// <param name="phone"></param>
        /// <returns>true正确,false错误</returns>
        public static Boolean IsMobile(string txt)
        {
            return Regex.IsMatch(txt, @"^13[0-9]{1}[0-9]{8}$|^15[0,1,2,3,4,5,6,7,8,9]{1}[0-9]{8}$|^18[0-9]{1}[0-9]{8}$|^14[0-9]{1}[0-9]{8}$", RegexOptions.IgnoreCase);
        }
        /// <summary>
        /// 验证电邮格式是否正常
        /// </summary>
        /// <param name="email"></param>
        /// <returns>true正确,false错误</returns>
        public static Boolean IsEmail(string txt)
        {
            return Regex.IsMatch(txt, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.IgnoreCase);
        }
        /// <summary>
        /// 验证身份证号
        /// </summary>
        /// <param name="str_idcard"></param>
        /// <returns></returns>
        public static Boolean IsIDcard(string txt)
        {
            return Regex.IsMatch(txt, @"(^\d{18}$)|(^\d{15}$)");
        }
        /// <summary>
        /// 验证数字
        /// </summary>
        /// <param name="txt"></param>
        /// <returns></returns>
        public static Boolean IsNumber(string txt)
        {
            return Regex.IsMatch(txt, @"^[0-9]*$");
        }
        /// <summary>
        /// 验证邮编
        /// </summary>
        /// <param name="txt"></param>
        /// <returns></returns>
        public static Boolean IsPostalCode(string txt)
        {
            return System.Text.RegularExpressions.Regex.IsMatch(txt, @"^\d{6}$");
        }
        /// <summary>
        /// 验证固话
        /// </summary>
        /// <param name="txt"></param>
        /// <returns></returns>
        public static Boolean IsTelephone(string txt)
        {
            return Regex.IsMatch(txt, @"^(\d{3,4}-)?\d{6,8}$");
        }
        #endregion

    }

其实还有进一步封装的可能!可以减少更多的代码量!不知道怎么发附件,有想要的话加我QQ 395088970

 

posted on 2011-04-11 17:06  断鱼  阅读(531)  评论(5编辑  收藏  举报