數(shù)據(jù)驗(yàn)證控件是asp.net中專門用來驗(yàn)證表單用戶輸入的控件。比如,requiredfieldvalidation就是一個專門用來驗(yàn)證用戶是否已經(jīng)輸入的控件,使用這個控件,可以保證用戶一定輸入了表單的某個表單項(xiàng)(比如數(shù)據(jù)輸入框)。另外,asp.net還專門提供了以下數(shù)據(jù)驗(yàn)證控件:
1. requiredfieldvalidator:檢查用戶是否輸入;
2. comparevalidator:檢查兩個表單輸入項(xiàng)的輸入信息是否存在某種指定關(guān)系,比如大、等于等;
3. rangevalidator:檢查用戶輸入是否在某一指定范圍;
4. regularexpressionvalidator:檢查用戶輸入是否符合某一指定的正則表達(dá)式要求;
5. customvalidator: 檢查用戶輸入是否符合開發(fā)者指定的驗(yàn)證邏輯規(guī)則。
本文的目的不是在于討論以上所有控件的用法,如果希望了解其他控件,可以參看:
http://samples.gotdotnet.com /quickstart /aspplus/doc /webvalidation.aspx。
customvalidator控件概述
簡單地使用前面提到的前四個數(shù)據(jù)驗(yàn)證控件,就可以實(shí)現(xiàn)我們一般開發(fā)的大部分?jǐn)?shù)據(jù)表單的驗(yàn)證要求。然而,有時候我們需要驗(yàn)證一些比較復(fù)雜的表單。想像一下,我們有一個比較復(fù)雜的調(diào)查表,該調(diào)查表包含一個有很多單選按鈕和多選按鈕的表單,一些多選按鈕和個人的愛好相對應(yīng),比如游泳、體育、閱讀等,調(diào)查表希望被調(diào)查人選擇自己的所有愛好。在這些選項(xiàng)下面,提示如下文字:“如果你提示有體育和游泳兩種愛好,請選擇您什么時候開始學(xué)習(xí)游泳”,在這些文字下方放置一些標(biāo)識年齡段的單選按鈕,這些按鈕是否有效取決于我們在前面提到的多選按鈕的選擇情況。在以上的驗(yàn)證情況中,我們就要使用到customvalidator數(shù)據(jù)驗(yàn)證控件。
在所有的asp.net數(shù)據(jù)驗(yàn)證控件中,都有一個“controltovalidate”的控件屬性需要設(shè)置,這個屬性用來指定表單中需要驗(yàn)證的表單項(xiàng)。在customvalidator數(shù)據(jù)驗(yàn)證控件中,需要做以下事情:
1. 讀取需要customvalidator驗(yàn)證的表單項(xiàng)值;
2. 執(zhí)行驗(yàn)證操作;
3. 決定被驗(yàn)證表單項(xiàng)是否符合驗(yàn)證要求。
在其他內(nèi)建控件中,以上步驟用戶是不知道也不要理睬的,但是,在使用customvalidator的時候,我們需要自己動手實(shí)現(xiàn)以上步驟。為了實(shí)現(xiàn)以上步驟,我們需要編寫一個服務(wù)器端數(shù)據(jù)驗(yàn)證函數(shù),該函數(shù)的樣式如下:
sub functionname(sender as object, args as servervalidateeventargs)
……
end sub
注意以上函數(shù)的args參數(shù),它是functionname函數(shù)的第二個參數(shù),這個參數(shù)有以下兩個屬性:
1. value:被驗(yàn)證數(shù)據(jù)表單的值。
2. isvalid:驗(yàn)證是否通過。如果通過,isvalid的值是true; 如果沒有通過,其值為false。
在使用customvalidator的時候,我們不但要設(shè)置“controltovalidate”屬性,我們還必須設(shè)置onservervalidate事件來處理服務(wù)器端的數(shù)據(jù)驗(yàn)證動作。
建立一個簡單的 
customvalidator控件
假設(shè)現(xiàn)在建立一個與數(shù)學(xué)有關(guān)的網(wǎng)站,在這個網(wǎng)站,我們要求瀏覽者提供自己喜歡的質(zhì)數(shù),以此來提高我們網(wǎng)站的訪問量。在asp.net中,沒有一個現(xiàn)成的可以專門驗(yàn)證質(zhì)數(shù)的服務(wù)器端數(shù)據(jù)驗(yàn)證控件,這樣,我們就有必要用到customvalidator控件。
以下例子用來驗(yàn)證用戶輸入的數(shù)是不是質(zhì)數(shù)。在這個表單中,有一個用戶輸入數(shù)據(jù)的textbox控件和一個button控件,還有用于驗(yàn)證是不是質(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”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>
如果對判定質(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。
客戶端驗(yàn)證
asp.net內(nèi)建數(shù)據(jù)驗(yàn)證控件的一大特點(diǎn)就是它們的所有驗(yàn)證都是在客戶端進(jìn)行的,不需經(jīng)過服務(wù)器端,而customvalidator控件的錯誤驗(yàn)證完全是通過服務(wù)器端實(shí)現(xiàn)的。必須意識到的一點(diǎn)是,不管是否通過客戶端實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證,服務(wù)器端的數(shù)據(jù)驗(yàn)證是一定會產(chǎn)生的。增加客戶端驗(yàn)證的功能,只是讓我們的數(shù)據(jù)驗(yàn)證控件更加友好。
為了實(shí)現(xiàn)客戶端驗(yàn)證的功能,我們必須使用javascript或者vbscript寫一個腳本函數(shù),因?yàn)関bscript只支持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控件也就有了客戶端驗(yàn)證功能。在以上代碼中,可能已經(jīng)注意到我們并沒有定義數(shù)據(jù)sender和args的類型,因?yàn)樵谀_本語言中,是沒有嚴(yán)格的數(shù)據(jù)類型定義的。
為了實(shí)現(xiàn)客戶端數(shù)據(jù)驗(yàn)證,惟一要做的就是在customvalidator控件定義中加入以下語句:clientvalidationfunction=“checkprime”,這里,其實(shí)就是指定自定義驗(yàn)證控件的客戶端驗(yàn)證函數(shù)。在這個例子里,前面定義的“checkprime”函數(shù)就是客戶端驗(yàn)證函數(shù)。
總結(jié) 
上面我們介紹了asp.net中幾乎是功能最靈活的數(shù)據(jù)驗(yàn)證控件customvalidator的使用,介紹了customvalidator控件的服務(wù)器端驗(yàn)證和客戶端驗(yàn)證的實(shí)現(xiàn)。盡管在實(shí)際的開發(fā)工作中,可能我們使用asp.net的內(nèi)置數(shù)據(jù)驗(yàn)證控件幾乎完全可以滿足我們的開發(fā)要求,但是若能了解customvalidator控件的使用和特點(diǎn)將會更有利于解決在工作中碰到的數(shù)據(jù)驗(yàn)證問題。
| 
 
 | 
新聞熱點(diǎn)
疑難解答
圖片精選