閱讀592 返回首頁    go 阿裏雲 go 技術社區[雲棲]


淺談在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=@"^https://([/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">

最後更新:2017-04-02 00:06:32

  上一篇:go innerHTMl和確認提示的使用
  下一篇:go about shtml and ssi