作為一名程式員,一定要對自己編寫的程式的健壯性負責,是以資料的校驗無論在商業邏輯還是系統實作都是必不可少的部分。
我這裡總結了一種自認為比較不錯的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]">