天天看点

浅谈在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));

returntrue;

#endregion

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

publicstringgetemailfielderror(stringerrorfield)

returnerrorfield+"格式不正确([email protected])!";

publicboolisvalidemail(datarowrow,stringfieldname,intmaxlen,stringerrorfield,boolallownull)

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));

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

publicstringgetzipfielderror(stringerrorfield)

returnerrorfield+"格式不正确(157032)!";

publicboolisvalidzip(datarowrow,stringfieldname,intmaxlen,stringerrorfield,boolallownull)

isvalid=(newregex(regexp_is_valid_zip)).ismatch(row[fieldname].tostring());

row.setcolumnerror(fieldname,getzipfielderror(errorfield));

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

publicstringgetssnfielderror(stringerrorfield)

returnerrorfield+"格式不正确(长度为15或18位)!";

publicboolisvalidssn(datarowrow,stringfieldname,intmaxlen,stringerrorfield,boolallownull)

isvalid=(newregex(regexp_is_valid_ssn)).ismatch(row[fieldname].tostring());

row.setcolumnerror(fieldname,getssnfielderror(errorfield));

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

publicstringgeturlfielderror(stringerrorfield)

returnerrorfield+"格式不正确(}

publicboolisvalidurl(datarowrow,stringfieldname,intmaxlen,stringerrorfield,boolallownull)

isvalid=(newregex(regexp_is_valid_url)).ismatch(row[fieldname].tostring());

row.setcolumnerror(fieldname,geturlfielderror(errorfield));

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

publicstringgetdatefielderror(stringerrorfield)

returnerrorfield+"日期格式不正确!";

publicboolisvaliddate(datarowrow,stringfieldname,intmaxlen,stringerrorfield,boolallownull)

isvalid=(newregex(regexp_is_valid_date)).ismatch(row[fieldname].tostring());

row.setcolumnerror(fieldname,getdatefielderror(errorfield));

#region校验数值类型字段格式方法

//这也是个判断数值的办法

privateboolisnumeric(stringvalue)

try

inti=int.parse(value);

catch

{returnfalse;}

publicstringgetfieldnumbererror(stringerrorfield)

returnerrorfield+"必须是数字(例如:90)!";

publicboolisvalidnumber(datarowrow,stringfieldname,stringerrorfield,boolallownull)

boolisvalid=(newregex(regexp_is_valid_demical)).ismatch(row[fieldname].tostring());

elseif((!isvalid)&&(i>0))

row.setcolumnerror(fieldname,getfieldnumbererror(errorfield));

//在继承了基类的businessrule中使用校验的方法

///使用上面的方法对数据进行有效性校验

///<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中显示错误提示信息

///显示提交数据返回的错误信息

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:[email protected]">