天天看點

淺談在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]">

繼續閱讀