目錄
1. 驗證控制項簡介
2. 驗證控制項的使用方法
3. 小結
--------------------------------------------------------------------------------
1. 驗證控制項簡介
顧名思義,驗證控制項就是校正使用者輸入資料正確性的控制項,如使用者在文字框中輸入資料後,便顯示一條提示資訊,表明了校正的資料是不合法的。驗證過程既可以在伺服器上執行,也可以在客戶機上執行,在用戶端啟動並執行校正代碼是資料提交之前被執行的,因此可以提高程式的效能。ASP.NET的驗證控制項可以進行多種校正,如資料範圍檢查、資料間的比較和自訂校正等等,下面的內容將會逐一介紹這些驗證控制項。
三種控制項的區別
(1) HTML控制項,ASP.NET把HTML控制項當成一般字元串渲染到瀏覽器端,不去檢查正確性,無法再伺服器端進行處理。
(2) ASP.NET服務端控制項,經過ASP.NET高度封裝的控制項,使用簡單,運行在伺服器端,可以再服務端使用C#代碼進行操作,會渲染到用戶端為HTML控制項。
(3) runat=”server”的HTML控制項,在HTML控制項的基礎上面添加runat=”server”,也是運行在服務端的,也可以服務端使用C#進行操作,也會渲染到用戶端,不像ASP.NET服務端控制項那樣高度封裝,暴露的屬性大部分是普通的HTML 屬性,和ASP.NET服務端控制項相比的好處是:當需要在服務端要對控制項進行操作的時候,如果控制項沒有被ASP.NET服務端控制項封裝的時候,用runat=”server”的HTML控制項更方便,runat=”server”的HTML控制項也會對虛擬路徑,id->ClientID進行處理,所以在使用虛擬路徑,UserControl中也可能會用到。
<input type=”Text” id=”txt1”runat=”server” />
(4) a->HtmlAnchor;form->HtmlForm;head->HtmlHead;input->HtmlInputButton,HtmlInputCheckBox,HtmlInputText等;meta->HtmlMeta;table->HtmlTable;tr->HtmlTableRow;td->HtmlTableCell;title->HtmlTitl。為單獨封裝的標籤(比如:div)對應的類型為:HtmlGenericControl。使用Attributes屬性操作未封裝的屬性。
(5) 服務端HTML控制項不像ASP.NET控制項那樣封裝的進階,比如:ASP.NET控制項的BgColor屬性為Color類型,而HTML控制項的BgColor屬性則為字串類型,需要開發人員設定合適的值。
註:在ascx寫入如下代碼,拖放一個TextBox控制項和Button控制項,如果要操作當滑鼠滑過Button控制項的時候給TextBox賦值,直接在Button控制項裡面寫onmouserover這樣是會報錯的,所以我們要單獨寫一個JavaScript方法。
| 代碼如下 |
複製代碼 |
|
<script type="text/javascript">
document.getElementById("<%=Button1.ClientID %>").onmouserover = function () {
document.getElementById("<%=TextBox1.ClientID %>").value = "Kencery";
}
</script> |
驗證控制項
(1) 必須要對使用者輸入的資料進行合法性校正,這些校正邏輯很多是重複的,比如:欄位不可為空,必須為日期格式,數字不能大於100等,而且要同時在用戶端和服務端校正,用戶端校正提高可用性,服務端校正防止惡意攻擊,ASP.NET驗證控制項就是為了簡化這些問題而提供的。
(2) ASP.NET提供了如下的組件
1) RequiredFieldValidator:欄位必填。
2) RangeValiclator:值在給定的最大值最小值之間。
3) CompareValidator:用於比較兩個值的關係是否滿足要求或者是否是指定類型的資料。
4) RegularExpressionValidator:校正資料滿足Regex。
5) CustomValidator:自訂驗證。
(3) RequiredFieldValidator
1) ControlToValidate設定要驗證的控制項,Text屬性為當被驗證的控制項為空白的時候顯示的錯誤資訊,Text不僅可以寫文本,還可以寫任何HTML內容。
2) 有時候控制項如果是預設值也認為是空值,比如:下拉式清單的選中值”---請選擇性別---”,文字框的值為”填入搜尋索引鍵”,只有將RequiredFieldValidator的InitialValue屬性設定為”---請選擇性別---”,”填入搜尋索引鍵”即可。
(4) Validator共性
1) 頁面中的IsValid屬性用來判斷頁面中的所有Validator是否都校正通過,只有都校正通過才會為True,即使頁面中的Validator服務端校正報錯(禁用JavaScript跳過用戶端校正),在服務端方法中的業務代碼(比如:btnOK.Click)也會被執行,因此如果代碼在資料校正不通過的不能執行,則需要判斷IsValid的值。
註:在Button控制項下面寫入如下代碼:
| 代碼如下 |
複製代碼 |
|
if(!IsValid){
return;
}
if(this.IsValid)
{
正確資訊;
else{
錯誤資訊;
} } |
2) 所有驗證控制項都有Display屬性,用來決定如何顯示錯誤資訊。三個值:static:沒有錯誤資訊的時候控制項的Visiblity樣式為Hidden來實現隱藏;Dynamic,沒有錯誤資訊的時候控制項的display樣式為none來實現隱藏,這兩者的區別在於:Visiblity:hidden隱藏控制項仍會佔據空間,而display:none隱藏則不會佔用控制項,Display屬性還可以設定為None(用來配合後面講的ValidationSummary)。
3) 幾乎所有的驗證控制項都有ControlToValidate,Text屬性,所有控制項都幾乎在用戶端和服務端都要進行校正。
4) 如果在一個頁面中同時放置註冊和登入表單,那麼他們的驗證就會同時進行,這樣雖然只是登入,但是註冊的驗證也會觸發,可以使用驗證組來解決這個問題,將同一組的控制項(表單,提交按鈕)等的ValidationGroup設定成相同的值就可以,這樣的話和Button等觸發事件的控制項ValidationGroup相同的控制項才會校正。
5) 如果將按鈕控制項(Button,ImageButton,LinkButton)的CausesValidator屬性設定為false,則這個按鈕的點擊不觸發校正。
(5) RangeValidator
1) RangeValidator:MininmumValue,MaximumValue為最小,最大值,Type屬性為資料類型(String,Interger,Double,Date,Currency等)。例如:年齡,畢業日期在合理範圍內。
2) RangeValidator,CompareValidator,RegularExpressValidator等都不會對非空值進行檢驗,所以如果欄位不允許為空白則需要在使用RequiredFieldValidator。
(6) CompareValidator
1) CompareValidator:Type屬性同RangeValidator,Operator屬性,比較操作符,可選值DataTypeCheck,Equal,GreaterThan,GreaterThanEqual,LessThan,LessThanEqual,NotEqual,ValueToCompare所比較的運算子右邊的值,ControlToCompare設定和另一個控制項進行比較。
2) 校正資料類型,不進行範圍的比較,ControlToValidate設定要校正的控制項,Type設定要校正的資料類型,Operator設定為DataTypeCheck。
3) 要進行範圍的比較,ControlToValidator設定要校正的控制項,Type設定要校正的資料類型,Operator設定為GreaterThan,ValueToCompare為要比較的值,也可以編程的時候動態設定。
4) 與另一個空間的值進行比較,ControlToValidate設定要校正的控制項,Type設定要檢驗的資料類型,Operator設定為GreaterThan,ControlToCompare設定為要比較的驗證控制項(運算子右邊的控制項)。
(7) 進階Validator
1) RegularExpressionValidator,ValidationExpression屬性為Regex,VS的可視化編輯提供了幾個內建的Regex,也可以自己寫,案例:檢驗Email地址,社會安全號碼碼,QQ號碼(5位至10位的數字),個人說明必須在10到50字之間。
2) CustomValidator,自訂驗證控制項,當ASP.NET內建的驗證控制項無法滿足要求的時候可以使用CustomValidator。
3) ServerValidate事件為服務端的校正代碼,在事件處理函數中讀取args.Value來獲得待校正的值,如果值合法則將args.IsValid設定為True,否則設定為False,如果為ClientValidationFunction設定一個函數名,那麼會首先在用戶端調用指定的JavaScript函數進行用戶端校正,否則將只做伺服器端校正,用戶端校正函數的簽名是:”函數名(src,args)”,argsd的屬性以及意義和服務端的一樣。
(8) 匯總錯誤訊息
1) 使用Validator錯誤訊息會顯示在放置的位置,這樣有兩個可能的問題,如果表單非常大,使用者看不到全部的錯誤資訊,希望把訊息集中顯示在提交按鈕旁邊,如果錯誤資訊非常多,錯誤資訊會散落各地,希望能集中顯示。
2) ValidationSummary控制項用來集中顯示錯誤資訊,每個驗證控制項都有ErrorMessage,Text兩個屬性,ErrorMessage是用來顯示到ValidationSummary中的值,Text是用來顯示在Validator位置的值,如果Text為空白,則ErrorMessage會同時顯示到ValidationSummary和控制項的位置,一般Text的值要簡短(比如:”必填”,”*”),因為直接顯示到空間的位置,能知道指的是哪個控制項,ErrorMessage要詳細一點(比如:”使用者名稱不可為空”,不能是”不可為空”等),這樣才能從ValidationSummary每條錯誤資訊中讀取值出來。
3) ValidationSummary的屬性:DisPlayMode:顯示模式,ShowMessageBox使用者同時顯示警告對話方塊。
驗證控制項的使用方法
① RequiredFieldValidator控制項
當頁面上的控制項要求必須輸入資料時,RequiredFieldValidator就起作用了,ControlToValidate屬性選擇需要驗證的控制項,而ErrorMessage屬性則是校正不合法後顯示的錯誤提示資訊。
| 代碼如下 |
複製代碼 |
<HTML>
<HEAD>
<title>RequiredFieldValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
Name:
<asp:TextBox id="TextBox1" runat="server" ></asp:TextBox>
<asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server"
ErrorMessage="Please enter your name" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
</form>
</BODY>
</HTML> |
②CompareValidator控制項
CompareValidator控制項是用來比較兩個輸入控制項之間的資料一致性的,同時也可以用來校正控制項中內容的資料類型:如整形、字串型等。ControlToCompare和ControlToValidate屬性用來設定進行比較的兩個控制項。
| 代碼如下 |
複製代碼 |
<HTML>
<HEAD>
<title>CompareValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
<P>Password:
<asp:TextBox id="txtPwd" runat="server" TextMode="Password"></asp:TextBox><BR>
Confirm:
<asp:TextBox id="TxtCfm" runat="server" TextMode="Password"></asp:TextBox></P>
<P>
<asp:Button id="Button2" runat="server" Text="Button"></asp:Button>
<asp:CompareValidator id="CompareValidator1" runat="server" ErrorMessage="Password Error!"
ControlToValidate="TxtCfm" ControlToCompare="txtPwd"></asp:CompareValidator></P>
</form>
</BODY>
</HTML> |
③RangeValidator控制項
RangeValidator控制項可以用來判斷使用者輸入的值是否在某一特定範圍內,屬性MaximumValue和MinimumValue用來定義範圍的最大和最小值。
| 代碼如下 |
複製代碼 |
<HTML>
<HEAD>
<title>RangeValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
<P>Age:
<asp:TextBox id="TxtAge" runat="server"></asp:TextBox>
<asp:RangeValidator id="RangeValidator1" runat="server" ControlToValidate="TxtAge"
ErrorMessage="Age Error!" MaximumValue="99" MinimumValue="1"></asp:RangeValidator></P>
</form>
</BODY>
</HTML> |
④RegularExpressionValidator控制項
RegularExpressionValidator控制項可以判斷使用者輸入的運算式是否正確,如電話號碼、郵編、URL等,ControlToValidate屬性選擇需要驗證的控制項,ValidationExpression屬性則編寫需要驗證的運算式的樣式,下面的例子就是一段校正郵編的代碼。
| 代碼如下 |
複製代碼 |
<HTML>
<HEAD>
<title>RegularExpressionValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
<P>Postal Code:
<asp:TextBox id="TxtPostalCode" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server"
ControlToValidate="TxtPostalCode" ErrorMessage="Postal Code Error!"
ValidationExpression="d6}"></asp:RegularExpressionValidator></P>
</form>
</BODY>
</HTML> |
⑤CustomValidator控制項
CustomValidator控制項用於執行使用者自訂的驗證,這種校正既可以是伺服器端的也可以是用戶端的,下面的代碼就是使用用戶端驗證郵編的例子。
| 代碼如下 |
複製代碼 |
<HTML>
<HEAD>
<title>CustomValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
<P>Postal Code:
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator id="CustomValidator1" runat="server" ControlToValidate="TextBox1"
ErrorMessage="CustomValidator" ClientValidationFunction="ClientValidate">
</asp:CustomValidator></P>
</form>
</BODY>
</HTML>
<script language="vbscript">
Sub ClientValidate(source, arguments)
If isnumeric(arguments.Value ) and len(arguments.Value)=6 Then
arguments.IsValid=true
Else
arguments.IsValid=false
End If
End Sub
</script> |
⑥ValidationSummary控制項
這個控制項會將頁面中所有的校正錯誤輸出為一個列表,列表的顯示方式由DisplayMode屬性設定。
| 代碼如下 |
複製代碼 |
<HTML>
<HEAD>
<title>ValidationSummary Example</title>
</HEAD>
<body>
<form id="Form1" runat="server">
<P>Age:
<asp:TextBox id="TxtAge" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server"
ControlToValidate="TxtAge" ErrorMessage="Age Error!" Display="None"></asp:RequiredFieldValidator><BR>
Postal Code:
<asp:TextBox id="TxtPostalCode" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator id="RequiredFieldValidator2" runat="server"
ControlToValidate="TxtPostalCode" ErrorMessage="Postal Code Error!"
Display="None"></asp:RequiredFieldValidator></P>
<P>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button></P>
<P>
<asp:ValidationSummary id="ValidationSummary1" runat="server"
HeaderText="You must enter a value in the following fields:"></asp:ValidationSummary></P>
</form>
</body>
</HTML> |