浅谈在ASP.NET中数据有效性校验的方法

作为一名程序员,一定要对自己编写的程序的健壮性负责,因此数据的校验无论在商业逻辑还是系统实现都是必不可少的部分。

我这里总结了一种自认为比较不错的asp.net(C#)的数据校验方法,如大家探讨。

主要用Regex的IsMatch方法,在BusinessRule层进行校验数据的有效性,并将校验的方法作为BusinessRule层基类的一部分。

在WebUI层现实提示信息。

usingSystem;
usingSystem.Data;
usingSystem.Text.RegularExpressions;
namespaceEducation.BusinessRules
{
///<summary>
///商业规则层的基类
///</summary>
publicclassBizObject
{
publicconstStringREGEXP_IS_VALID_EMAIL=@"^/w+((-/w+)|(/./w+))*/@/w+((/.|-)/w+)*/./w+$";//电子邮件校验常量
publicconstStringREGEXP_IS_VALID_URL=@"^http://([/w-]+/.)+[/w-]+(/[/w-./?%&=]*)?";//网址校验常量
publicconstStringREGEXP_IS_VALID_ZIP=@"/d{6}";//邮编校验常量
publicconstStringREGEXP_IS_VALID_SSN=@"/d{18}|/d{15}";//身份证校验常量
publicconstStringREGEXP_IS_VALID_INT=@"^/d{1,}$";//整数校验常量
publicconstStringREGEXP_IS_VALID_DEMICAL=@"^-?(0|/d+)(/./d+)?$";//数值校验常量"
//日期校验常量
publicconstStringREGEXP_IS_VALID_DATE=@"^(?:(?:(?:(?:1[6-9]|[2-9]/d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(//|-|/.)(?:0?2/1(?:29))$)|(?:(?:1[6-9]|[2-9]/d)?/d{2})(//|-|/.)(?:(?:(?:0?[13578]|1[02])/2(?:31))|(?:(?:0?[1,3-9]|1[0-2])/2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))/2(?:0?[1-9]|1/d|2[0-8]))$";

publicBizObject(){}

#region校验字段是否为空或字段长度超长方法

publicstringGetFieldTooLongError(stringErrorField,intmaxlen)
{
returnErrorField+"信息超长,请删减至"+maxlen.ToString()+"个字符!";
}

publicstringGetFieldNullError(stringErrorField)
{
returnErrorField+"是必填项,不允许为空!";
}

publicboolIsValidField(DataRowRow,StringfieldName,intmaxLen,stringErrorField,boolAllowNull)
{
inti=(short)(Row[fieldName].ToString().Trim().Length);

if(i<1&&(!AllowNull))
{
Row.SetColumnError(fieldName,GetFieldNullError(ErrorField));
returnfalse;
}
elseif(i>maxLen)
{
Row.SetColumnError(fieldName,GetFieldTooLongError(ErrorField,maxLen));
returnfalse;
}
returntrue;
}
#endregion

#region校验电子邮件类型字段格式方法

publicstringGetEmailFieldError(stringErrorField)
{
returnErrorField+"格式不正确(a@b.c)!";
}
publicboolIsValidEmail(DataRowRow,StringfieldName,intmaxLen,stringErrorField,boolAllowNull)
{
inti=(short)(Row[fieldName].ToString().Trim().Length);

boolisValid=IsValidField(Row,fieldName,maxLen,ErrorField,AllowNull);

if(isValid)
{
isValid=(newRegex(REGEXP_IS_VALID_EMAIL)).IsMatch(Row[fieldName].ToString());

if((!isValid)&&(i>0))
{
Row.SetColumnError(fieldName,GetEmailFieldError(ErrorField));
returnfalse;
}
}
returntrue;
}
#endregion

#region校验邮编类型字段格式方法

publicstringGetZipFieldError(stringErrorField)
{
returnErrorField+"格式不正确(157032)!";
}
publicboolIsValidZip(DataRowRow,StringfieldName,intmaxLen,stringErrorField,boolAllowNull)
{
inti=(short)(Row[fieldName].ToString().Trim().Length);

boolisValid=IsValidField(Row,fieldName,maxLen,ErrorField,AllowNull);

if(isValid)
{
isValid=(newRegex(REGEXP_IS_VALID_ZIP)).IsMatch(Row[fieldName].ToString());

if((!isValid)&&(i>0))
{
Row.SetColumnError(fieldName,GetZipFieldError(ErrorField));
returnfalse;
}
}
returntrue;
}
#endregion

#region校验身份证类型字段格式方法

publicstringGetSSNFieldError(stringErrorField)
{
returnErrorField+"格式不正确(长度为15或18位)!";
}
publicboolIsValidSSN(DataRowRow,StringfieldName,intmaxLen,stringErrorField,boolAllowNull)
{
inti=(short)(Row[fieldName].ToString().Trim().Length);

boolisValid=IsValidField(Row,fieldName,maxLen,ErrorField,AllowNull);

if(isValid)
{
isValid=(newRegex(REGEXP_IS_VALID_SSN)).IsMatch(Row[fieldName].ToString());

if((!isValid)&&(i>0))
{
Row.SetColumnError(fieldName,GetSSNFieldError(ErrorField));
returnfalse;
}
}
returntrue;
}
#endregion

#region校验网址类型字段格式方法

publicstringGetUrlFieldError(stringErrorField)
{
returnErrorField+"格式不正确(}
publicboolIsValidUrl(DataRowRow,StringfieldName,intmaxLen,stringErrorField,boolAllowNull)
{
inti=(short)(Row[fieldName].ToString().Trim().Length);

boolisValid=IsValidField(Row,fieldName,maxLen,ErrorField,AllowNull);

if(isValid)
{
isValid=(newRegex(REGEXP_IS_VALID_URL)).IsMatch(Row[fieldName].ToString());

if((!isValid)&&(i>0))
{
Row.SetColumnError(fieldName,GetUrlFieldError(ErrorField));
returnfalse;
}
}
returntrue;
}
#endregion

#region校验日期类型字段格式方法

publicstringGetDateFieldError(stringErrorField)
{
returnErrorField+"日期格式不正确!";
}
publicboolIsValidDate(DataRowRow,StringfieldName,intmaxLen,stringErrorField,boolAllowNull)
{
inti=(short)(Row[fieldName].ToString().Trim().Length);

boolisValid=IsValidField(Row,fieldName,maxLen,ErrorField,AllowNull);

if(isValid)
{
isValid=(newRegex(REGEXP_IS_VALID_DATE)).IsMatch(Row[fieldName].ToString());

if((!isValid)&&(i>0))
{
Row.SetColumnError(fieldName,GetDateFieldError(ErrorField));
returnfalse;
}
}
returntrue;
}
#endregion

#region校验数值类型字段格式方法
//这也是个判断数值的办法
privateboolIsNumeric(stringValue)
{
try
{
inti=int.Parse(Value);
returntrue;
}
catch
{returnfalse;}
}

publicstringGetFieldNumberError(stringErrorField)
{
returnErrorField+"必须是数字(例如:90)!";
}

publicboolIsValidNumber(DataRowRow,StringfieldName,stringErrorField,boolAllowNull)
{
inti=(short)(Row[fieldName].ToString().Trim().Length);

boolisValid=(newRegex(REGEXP_IS_VALID_DEMICAL)).IsMatch(Row[fieldName].ToString());

if(i<1&&(!AllowNull))
{
Row.SetColumnError(fieldName,GetFieldNullError(ErrorField));
returnfalse;
}
elseif((!isValid)&&(i>0))
{
Row.SetColumnError(fieldName,GetFieldNumberError(ErrorField));
returnfalse;
}
returntrue;
}
#endregion

}
}

//在继承了基类的BusinessRule中使用校验的方法
///<summary>
///使用上面的方法对数据进行有效性校验
///</summary>
///<paramname="Row">数据行</param>
///<returns>通过--true不通过--false</returns>
publicboolValidate(DataRowRow)
{
boolisValid;
Row.ClearErrors();
isValid=IsValidField(Row,"name",20,"姓名",false);
isValid&=IsValidZip(Row,"zip",6,"邮编",true);
isValid&=IsValidNumber(Row,"age","年龄",false);
isValid&=IsValidEmail(Row,"email",50,"电子邮件",true);
returnisValid;
}

//在WebUI中显示错误提示信息
///<summary>
///显示提交数据返回的错误信息
///</summary>
privatevoidDisplayErrors()
{
StringfieldErrors="";
StringtmpfieldErrors="";

DataRowRow=ds.Tables[0].Rows[0];

foreach(DataColumnColumninds.Tables[0].Columns)
{
tmpfieldErrors=Row.GetColumnError(Column.ColumnName.ToString());
if(tmpfieldErrors!="")
{
fieldErrors+="<li>"+tmpfieldErrors+"<br>";
}
}
//显示错误信息
this.lblError.Text=fieldErrors;
}

="MAILTO:A@B.C">
上一篇:maven的安装和使用


下一篇:《第三方JavaScript编程》——1.2 第三方JavaScript的用法