使用ASP.NET定製資料驗證控制元件
資料驗證控制元件是ASP.NET中專門用來驗證表單使用者輸入的控制元件。比如,RequiredFieldValidation就是一個專門用來驗證使用者是否已經輸入的控制元件,使用這個控制元件,可以保證使用者一定輸入了表單的某個表單項(比如資料輸入框)。另外,ASP.NET還專門提供了以下資料驗證控制元件:
1. RequiredFieldValidator:檢查使用者是否輸入;
2. CompareValidator:檢查兩個表單輸入項的輸入資訊是否存在某種指定關係,比如大、等於等;
3. RangeValidator:檢查使用者輸入是否在某一指定範圍;
4. RegularExpressionValidator:檢查使用者輸入是否符合某一指定的正則表示式要求;
5. CustomValidator: 檢查使用者輸入是否符合開發者指定的驗證邏輯規則。
本文的目的不是在於討論以上所有控制元件的用法,如果希望瞭解其他控制元件,可以參看:
http://samples.gotdotnet.com /quickstart /aspplus/doc /webvalidation.aspx。
CustomValidator控制元件概述
簡單地使用前面提到的前四個資料驗證控制元件,就可以實現我們一般開發的大部分資料表單的驗證要求。然而,有時候我們需要驗證一些比較複雜的表單。想像一下,我們有一個比較複雜的調查表,該調查表包含一個有很多單選按鈕和多選按鈕的表單,一些多選按鈕和個人的愛好相對應,比如游泳、體育、閱讀等,調查表希望被調查人選擇自己的所有愛好。在這些選項下面,提示如下文字:“如果你提示有體育和游泳兩種愛好,請選擇您什麼時候開始學習游泳”,在這些文字下方放置一些標識年齡段的單選按鈕,這些按鈕是否有效取決於我們在前面提到的多選按鈕的選擇情況。在以上的驗證情況中,我們就要使用到CustomValidator資料驗證控制元件。
在所有的ASP.NET資料驗證控制元件中,都有一個“ControlToValidate”的控制元件屬性需要設定,這個屬性用來指定表單中需要驗證的表單項。在CustomValidator資料驗證控制元件中,需要做以下事情:
1. 讀取需要CustomValidator驗證的表單項值;
2. 執行驗證操作;
3. 決定被驗證表單項是否符合驗證要求。
在其他內建控制元件中,以上步驟使用者是不知道也不要理睬的,但是,在使用CustomValidator的時候,我們需要自己動手實現以上步驟。為了實現以上步驟,我們需要編寫一個伺服器端資料驗證函式,該函式的樣式如下:
Sub FunctionName(sender as Object, args as ServerValidateEventArgs)
……
End Sub
注意以上函式的args引數,它是FunctionName函式的第二個引數,這個引數有以下兩個屬性:
1. Value:被驗證資料表單的值。
2. IsValid:驗證是否通過。如果通過,IsValid的值是True; 如果沒有通過,其值為False。
在使用CustomValidator的時候,我們不但要設定“ControlToValidate”屬性,我們還必須設定OnServerValidate事件來處理伺服器端的資料驗證動作。
建立一個簡單的
CustomValidator控制元件
假設現在建立一個與數學有關的網站,在這個網站,我們要求瀏覽者提供自己喜歡的質數,以此來提高我們網站的訪問量。在ASP.NET中,沒有一個現成的可以專門驗證質數的伺服器端資料驗證控制元件,這樣,我們就有必要用到CustomValidator控制元件。
以下例子用來驗證使用者輸入的數是不是質數。在這個表單中,有一個使用者輸入資料的TextBox控制元件和一個Button控制元件,還有用於驗證是不是質數的CustomValidator控制元件,和兩個用於保證使用者輸入為正數的CompareValidator控制元件。
< script language=“vb” runat=“server” > Sub btnSubmit_Click(sender as Object, e as EventArgs) If Page.IsValid then Response.Write(“< font color=““red””> < i>”& txtPrimeNumber.Text & “is, indeed, a good prime number. < /i>< /font>”) Else Response.Write(“< font color=““red””> < i>” & txtPrimeNumber.Text & “is < b>not< /b> a prime number.< /i>< /font>”) End If End Sub Sub PrimeNumberCheck(sender as Object, args as ServerValidateEventArgs) Dim iPrime as Integer = Cint(args.Value), iLoop as Integer, iSqrt as Integer = CInt(Math.Sqrt(iPrime)) For iLoop = 2 to iSqrt If iPrime mod iLoop = 0 then args.IsValid = False Exit Sub End If Next args.IsValid = True End Sub < /script> < form method=“post” runat=“server”> Enter your favorite prime number: < asp:textbox id=“txtPrimeNumber” runat=“server” /> < %-- 建立CustomValidator 控制元件 --%> < asp:CustomValidator runat=“server” id=“custPrimeCheck” ControlToValidate=“txtPrimeNumber” OnServerValidate=“PrimeNumberCheck” ErrorMessage=“Invalid Prime Number”/> < %-- 建立兩個CompareValidator控制元件:第一個保證輸入為數字; 第二個保證輸入為正數 --%> < asp:CompareValidator runat=“server” id=“compPrimeNumber”Operator=“DataTypeCheck” Type=“Integer” Display=“Dynamic” ControlToValidate= “txtPrimeNumber”ErrorMessage = “You must enter an integer value.”/> < asp:CompareValidator runat=“server” id=“compPrimeNumberPositive”Operator=“GreaterThan” Type=“Integer” Display=“Dynamic” ValueToCompare=“0” ControlToValidate=“txtPrimeNumber” ErrorMessage =“You must enter a value greater than zero.”/> < p>< asp:button id=“btnSubmit” runat= “server”OnClick=“btnSubmit_Click” Text=“Submit” /> < /form>
如果對判定質數不是太熟悉,可能對於以上的PrimeNumberCheck事件處理感覺比較迷惑。首先,將使用者在txtPrimeNumber輸入的資料通過事件的args.value傳送給txtPrimeNumber,然後,將使用者的輸入開平方根,再將使用者輸入的數字除以從2到剛才算出的平方根之間的每一個數字。如果出現結果為零的情況,說明使用者輸入的數字不是質數,設定args.isValid為False; 如果全部為零,說明使用者輸入合法,設定args.isValid為True。
客戶端驗證
ASP.NET內建資料驗證控制元件的一大特點就是它們的所有驗證都是在客戶端進行的,不需經過伺服器端,而CustomValidator控制元件的錯誤驗證完全是通過伺服器端實現的。必須意識到的一點是,不管是否通過客戶端實現資料驗證,伺服器端的資料驗證是一定會產生的。增加客戶端驗證的功能,只是讓我們的資料驗證控制元件更加友好。
為了實現客戶端驗證的功能,我們必須使用JavaScript或者VBScript寫一個指令碼函式,因為VBScript只支援IE瀏覽器,因此,這裡我們採用JavaScript來編寫這個函式:
< script language=“JavaScript” > < !-- function CheckPrime(sender, args) { var iPrime = parseInt(args.Value); var iSqrt = parseInt(Math.sqrt(iPrime)); for (var iLoop=2; iLoop< =iSqrt; iLoop++) if (iPrime % iLoop == 0) { args.IsValid = false; return; } args.IsValid = true; } // --> < /script >
在這個例子裡面,我們輸入數字6,然後按“Tab”按鈕。在高版本的瀏覽器裡面,我們將看到來自CustomValidator控制元件的錯誤資訊,這樣,我們的CustomValidator控制元件也就有了客戶端驗證功能。在以上程式碼中,可能已經注意到我們並沒有定義資料sender和args的型別,因為在指令碼語言中,是沒有嚴格的資料型別定義的。
為了實現客戶端資料驗證,惟一要做的就是在CustomValidator控制元件定義中加入以下語句:ClientValidationFunction=“CheckPrime”,這裡,其實就是指定自定義驗證控制元件的客戶端驗證函式。在這個例子裡,前面定義的“CheckPrime”函式就是客戶端驗證函式。
總結
上面我們介紹了ASP.NET中幾乎是功能最靈活的資料驗證控制元件CustomValidator的使用,介紹了CustomValidator控制元件的伺服器端驗證和客戶端驗證的實現。儘管在實際的開發工作中,可能我們使用ASP.NET的內建資料驗證控制元件幾乎完全可以滿足我們的開發要求,但是若能瞭解CustomValidator控制元件的使用和特點將會更有利於解決在工作中碰到的資料驗證問題。