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