带了几个同事一块儿做项目,在发布信息时,会有些验证,比如非空,邮箱,手机号码之类。当然我们最原始的做法就是一个一个判断,去验证是否符合我们的要求。
但是这样问题就来了,我们会发现按钮事件里面的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