ASP.NET數(shù)據(jù)驗證控件CustomValidator的使用淺析
ASP.NET數(shù)據(jù)驗證控件的強(qiáng)大是因為在ASP中進(jìn)行表單數(shù)據(jù)驗證時,通常開發(fā)者必須自己編寫一套驗證的規(guī)則,然后自己將這些代碼拷貝到ASP代碼中對表單進(jìn)行驗證。這樣進(jìn)行驗證的方式實在不太方便,幸運的是,ASP.NET解決了這個問題,這就是數(shù)據(jù)驗證Web控件。
ASP.NET數(shù)據(jù)驗證控件CustomValidator控件概述
簡單地使用前面提到的前四個數(shù)據(jù)驗證控件,就可以實現(xiàn)我們一般開發(fā)的大部分?jǐn)?shù)據(jù)表單的驗證要求。然而,有時候我們需要驗證一些比較復(fù)雜的表單。想像一下,我們有一個比較復(fù)雜的調(diào)查表,該調(diào)查表包含一個有很多單選按鈕和多選按鈕的表單,一些多選按鈕和個人的愛好相對應(yīng),比如游泳、體育、閱讀等,調(diào)查表希望被調(diào)查人選擇自己的所有愛好。在這些選項下面,提示如下文字:“如果你提示有體育和游泳兩種愛好,請選擇您什么時候開始學(xué)習(xí)游泳”,在這些文字下方放置一些標(biāo)識年齡段的單選按鈕,這些按鈕是否有效取決于我們在前面提到的多選按鈕的選擇情況。在以上的驗證情況中,我們就要使用到CustomValidator數(shù)據(jù)驗證控件。
在所有的ASP.NET數(shù)據(jù)驗證控件中,都有一個“ControlToValidate”的控件屬性需要設(shè)置,這個屬性用來指定表單中需要驗證的表單項。在CustomValidator數(shù)據(jù)驗證控件中,需要做以下事情:
1. 讀取需要CustomValidator驗證的表單項值;
2. 執(zhí)行驗證操作;
3. 決定被驗證表單項是否符合驗證要求。
在其他內(nèi)建控件中,以上步驟用戶是不知道也不要理睬的,但是,在使用CustomValidator的時候,我們需要自己動手實現(xiàn)以上步驟。為了實現(xiàn)以上步驟,我們需要編寫一個服務(wù)器端數(shù)據(jù)驗證函數(shù),該函數(shù)的樣式如下:
- Sub FunctionName(sender as Object, args as ServerValidateEventArgs)
- ……
- End Sub
注意以上函數(shù)的args參數(shù),它是FunctionName函數(shù)的第二個參數(shù),這個參數(shù)有以下兩個屬性:
1. Value:被驗證數(shù)據(jù)表單的值。
2. IsValid:驗證是否通過。如果通過,IsValid的值是True; 如果沒有通過,其值為False。
在使用CustomValidator的時候,我們不但要設(shè)置“ControlToValidate”屬性,我們還必須設(shè)置OnServerValidate事件來處理服務(wù)器端的數(shù)據(jù)驗證動作。
建立一個簡單的ASP.NET數(shù)據(jù)驗證控件CustomValidator
假設(shè)現(xiàn)在建立一個與數(shù)學(xué)有關(guān)的網(wǎng)站,在這個網(wǎng)站,我們要求瀏覽者提供自己喜歡的質(zhì)數(shù),以此來提高我們網(wǎng)站的訪問量。在ASP.NET中,沒有一個現(xiàn)成的可以專門驗證質(zhì)數(shù)的服務(wù)器端數(shù)據(jù)驗證控件,這樣,我們就有必要用到CustomValidator控件。
以下例子用來驗證用戶輸入的數(shù)是不是質(zhì)數(shù)。在這個表單中,有一個用戶輸入數(shù)據(jù)的TextBox控件和一個Button控件,還有用于驗證是不是質(zhì)數(shù)的CustomValidator控件,和兩個用于保證用戶輸入為正數(shù)的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控件:***個保證輸入為數(shù)字;
- 第二個保證輸入為正數(shù) --%﹥
- ﹤ asp:CompareValidator runat=“server”
- id=“compPrimeNumber”O(jiān)perator=“DataTypeCheck”
- Type=“Integer”
- Display=“Dynamic” ControlToValidate=
- “txtPrimeNumber”ErrorMessage =
- “You must enter an integer value.”/﹥
- ﹤ asp:CompareValidator runat=“server”
- id=“compPrimeNumberPositive”O(jiān)perator=“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”O(jiān)nClick=“btnSubmit_Click” Text=“Submit” /﹥
- ﹤ /form﹥
如果對判定質(zhì)數(shù)不是太熟悉,可能對于以上的PrimeNumberCheck事件處理感覺比較迷惑。首先,將用戶在txtPrimeNumber輸入的數(shù)據(jù)通過事件的args.value傳送給txtPrimeNumber,然后,將用戶的輸入開平方根,再將用戶輸入的數(shù)字除以從2到剛才算出的平方根之間的每一個數(shù)字。如果出現(xiàn)結(jié)果為零的情況,說明用戶輸入的數(shù)字不是質(zhì)數(shù),設(shè)置args.isValid為False; 如果全部為零,說明用戶輸入合法,設(shè)置args.isValid為True。
ASP.NET數(shù)據(jù)驗證控件之客戶端驗證
ASP.NET內(nèi)建數(shù)據(jù)驗證控件的一大特點就是它們的所有驗證都是在客戶端進(jìn)行的,不需經(jīng)過服務(wù)器端,而CustomValidator控件的錯誤驗證完全是通過服務(wù)器端實現(xiàn)的。必須意識到的一點是,不管是否通過客戶端實現(xiàn)數(shù)據(jù)驗證,服務(wù)器端的數(shù)據(jù)驗證是一定會產(chǎn)生的。增加客戶端驗證的功能,只是讓我們的數(shù)據(jù)驗證控件更加友好。
為了實現(xiàn)客戶端驗證的功能,我們必須使用JavaScript或者VBScript寫一個腳本函數(shù),因為VBScript只支持IE瀏覽器,因此,這里我們采用JavaScript來編寫這個函數(shù):
- ﹤ 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 ﹥
在這個例子里面,我們輸入數(shù)字6,然后按“Tab”按鈕。在高版本的瀏覽器里面,我們將看到來自CustomValidator控件的錯誤信息,這樣,我們的CustomValidator控件也就有了客戶端驗證功能。在以上代碼中,可能已經(jīng)注意到我們并沒有定義數(shù)據(jù)sender和args的類型,因為在腳本語言中,是沒有嚴(yán)格的數(shù)據(jù)類型定義的。
為了實現(xiàn)客戶端數(shù)據(jù)驗證,惟一要做的就是在CustomValidator控件定義中加入以下語句:ClientValidationFunction=“CheckPrime”,這里,其實就是指定自定義驗證控件的客戶端驗證函數(shù)。在這個例子里,前面定義的“CheckPrime”函數(shù)就是客戶端驗證函數(shù)。
ASP.NET數(shù)據(jù)驗證控件CustomValidator的使用總結(jié)
上面我們介紹了ASP.NET中幾乎是功能最靈活的數(shù)據(jù)驗證控件CustomValidator的使用,介紹了CustomValidator控件的服務(wù)器端驗證和客戶端驗證的實現(xiàn)。盡管在實際的開發(fā)工作中,可能我們使用ASP.NET的內(nèi)置數(shù)據(jù)驗證控件幾乎完全可以滿足我們的開發(fā)要求,但是若能了解CustomValidator控件的使用和特點將會更有利于解決在工作中碰到的數(shù)據(jù)驗證問題。
ASP.NET數(shù)據(jù)驗證控件CustomValidator的使用的基本情況就向你介紹到這里,希望對你有所幫助。
【編輯推薦】