ASP.NET 2.0伺服器控制項之實現驗證控制項

來源:互聯網
上載者:User
asp.net|伺服器|控制項

  為了更好的建立互動式Web應用程式,加強應用程式安全性(例如,防止指令碼入侵等),開發人員應該對使用者輸入的部分提供驗證功能。過去,輸入驗證功能基本由自行編寫的用戶端指令碼來完成這種實現方法既繁瑣,又容易出現錯誤。隨著技術的發展,ASP.NET技術通過提供一系列驗證控制項來克服這些缺點,例如,RequiredFieldValidator、CompareValidator、RangeValidator等。使用這些驗證控制項,開發人員可以向Web頁面添加輸入驗證功能,例如定義驗證規則、定義向使用者顯示的錯誤資訊內容等。通常情況下,ASP.NET提供的驗證控制項可以滿足大多數Web應用的需要,然而,在某些情況下,內建的驗證控制項還是無法完成應用需求對資料輸入的特殊要求。為了彌補這個缺憾,ASP.NET 2.0定義了一個可以在控制項開發中使用的可擴充驗證架構。開發人員可以通過使用這個驗證架構自行定義驗證控制項。本文將對實現驗證控制項的重要方面進行介紹,內容包括內建驗證控制項概述,驗證架構等等。

  1. 內建驗證控制項概述

  驗證控制項完成對輸入資料進行驗證的功能。通過將驗證控制項和輸入控制項關聯,開發人員可以向Web頁面添加輸入驗證功能。另外,還提供了自訂驗證規則的方法和自訂錯誤資訊的內容和顯示方式等。本節將概括性介紹ASP.NET內建驗證控制項。

  ASP.NET 2.0共包含5個內建驗證控制項:RequiredFieldValidator、CompareValidator、RangeValidator、RegularExpressionValidator和CustomValidator,這些控制項直接或者間接派生自System.Web.UI.WebControls.BaseValidator。每個驗證控制項執行特定類型的驗證,並且當驗證失敗時顯示自訂訊息。下面簡要介紹了這5個驗證控制項。

  (1)RequiredFieldValidator控制項

  該控制項用於確保被驗證的控制項中包含一個值。

  (2)CompareValidator控制項

  該控制項使用比較子(小於、等於、大於等)將使用者輸入與一個常量值或另一控制項的屬性值進行比較。

  (3)RangeValidator控制項

  該控制項用於檢查使用者的輸入是否在指定的上下限內。可以檢查數字對、字母字元對和日期對的範圍。

  (4)RegularExpressionValidator控制項

  該控制項用於檢查項與Regex定義的模式是否匹配。這種驗證類型允許檢查可預知的字元序列,如社會安全號碼碼、電子郵件地址、電話號碼、郵遞區號等中的字元序列。

  (5)CustomValidator控制項

  該控制項用於使用您自己編寫的驗證邏輯檢查使用者輸入。這種驗證類型允許檢查在運行時匯出的值。

  除以上內建驗證控制項外,ASP.NET 2.0還提供了一個用於顯示錯誤資訊概要的控制項ValidationSummary。該控制項的目的是將來自頁上所有驗證控制項的錯誤資訊,一起顯示在一個位置,例如,一個訊息框或者一個錯誤資訊列表。ValidationSummary控制項不執行驗證,但是它可以和所有驗證控制項一起使用,更準確的說,ValidationSummary可以和上述5個內建驗證控制項以及自訂驗證控制項,共同完成驗證功能。

  在Web頁面中使用驗證控制項,我們需要注意以下幾個關鍵的方面。

  首先,將驗證控制項與輸入控制項關聯起來,然後,根據不同類型驗證控制項的特徵定義相關屬性。例如:所有驗證控制項都要通過ContrlToValidate屬性進行關聯設定,都必須通過ErrorMessage屬性定義錯誤資訊內容;對於範圍檢查控制項RangeValidator來講,必須定義MaximumValue和MinimumValue屬性來指定有效範圍的最小值和最大值;對於模式比對控制項RegularExpressionValidator來講,必須使用ValidationExpression屬性指定用於驗證輸入控制項的Regex。以上介紹的使用方式,很可能使得一個輸入控制項關聯多個驗證控制項,這在ASP.NET 2.0中是允許的。

  其次,ASP.NET 2.0中為驗證控制項提供了一個新屬性ValidationGroup。開發人員可使用使用該屬性將單個控制項與驗證組相關聯,然後,使用多個ValidationSummary控制項收集和報告這些組的錯誤。如果未指定驗證組,則驗證功能等效於ASP.NET 1.x中的驗證功能。如果在多個控制項中指定了多個驗證組,則一定會顯示多個驗證摘要控制項,因為一個驗證摘要只顯示一個組的驗證錯誤。回傳到伺服器且當前具有CausesValidation屬性的控制項也引入了此ValidationGroup屬性,該屬性確定當控制項導致回傳時應當驗證的控制群組。如果未指定驗證組,則會驗證預設組,預設組由所有沒有顯式分配組的驗證程式組成。

  最後,一旦在Web頁面中正確包含驗證控制項,那麼開發人員就可以使用自己的代碼來測試頁或者單個驗證控制項的狀態。例如,在使用輸入資料之前來測實驗證控制項的IsValid屬性。如果為true,表示輸入資料有效;如果為false,表示輸入錯誤,並顯示錯誤資訊。對於Web頁面來講,只有當所有驗證控制項的IsValid都為true,即所有輸入資料都符合驗證條件時,Page類的IsValid屬性才設定為true,否則為false。另外,在頁面級驗證中,ASP.NET 2.0還提供了兩個新方法來支援驗證功能。一個是來自Page類的GetValidators方法,該方法將檢索屬於指定驗證組的驗證程式。還有一個也是來自Page類的Validate方法的重載,其允許採用驗證組作為參數。

  2. 驗證控制項實現機制

  通常情況下,使用ASP.NET 2.0的5個內建驗證控制項,可以滿足多數應用程式的需要。然而,為了提高開發的靈活性,滿足不同Web應用的需求,ASP.NET 2.0內建了一個可擴充的驗證架構。該架構定義了伺服器端和用戶端的基本實現規則。開發人員可以使用這個可擴充的驗證架構,根據應用需要設計自己的驗證控制項來實現新的設計規則。

  (1)伺服器端實現機制

  並非所有的Web伺服器控制項都支援驗證控制項。可以使用驗證控制項進行驗證的標準控制項包括:TextBox、ListBox、DropDownList、RadioButtonList、HtmlInputText、HtmlInputFile、HtmlSelect和HtmlTextArea、FileUpload和HtmlInputPassword等。這些支援驗證控制項的控制項有一個共同特徵,即中繼資料中包含System.Web.UI.ValidationPropertyAttribute。ValidationPropertyAttribute定義了控制項用於標識驗證屬性的中繼資料特性。除此之外,如果由以上控制項派生的自訂控制項類,需要支援驗證,那麼必須在控制項類前定義ValidationPropertyAttribute,這樣該控制項才能作為驗證目標控制項。開發人員在實現自訂驗證控制項過程中,必須首先瞭解以上所介紹的驗證目標控制項內容,然後才能更好的開發控制項。

  為了實現自訂驗證控制項,ASP.NET 2.0提供了3個重要對象:(1)System.Web.UI.IValidator;(2)System.Web.UI.WebControls.BaseValidator;(3)System.Web.UI.WebControls.CustomValidator。以上三者之間聯絡緊密,由它們組成的驗證架構具有很強的靈活性和可擴充性。IValidator介面是驗證架構的基礎,任何實現該介面的類都可以作為驗證程式。BaseValidator是抽象基類,該類實現IValidator介面,並繼承System.Web.UI.WebControls.Label控制項。通常情況下,自訂驗證控制項都派生自該類。CustomValidator實際是一個驗證控制項,開發人員可以用它來添加自訂的驗證邏輯。為了更好的說明驗證架構,下面將逐一介紹以上3個對象。

  IValidator介面的定義如下:

public interface Ivalidator
{
 string ErrorMessage {get; set;}
 bool IsValid {get; set;}
 void Validate();
}


  IValidator介面的成員包括1個方法和2個屬性。ErrorMessage屬性用於擷取或設定條件驗證失敗時產生的錯誤資訊。IsValid屬性當由類實現時,擷取或設定一個值,通過該值指示使用者在指定控制項中輸入的內容是否通過驗證。Validate方法由類實現時,計算它檢查的條件並更新IsValid屬性。對於開發人員來講,如果實現的是一個普通驗證程式,而非驗證控制項,那麼可以通過實現該介面來完成。其原因在於驗證架構的實現分布在Page類、BaseValidator類和驗證目標控制項中。這些類之間的相關性不允許任意實現IValidator介面。對於實現自訂驗證控制項,推薦的方法是繼承BaseValidator類。

  BaseValidator是驗證架構中最為重要的部分。該類派生自Label類,並且實現IValidator介面。無論是內建驗證控制項,還是自訂驗證控制項,都必須派生自BaseValidator類。該類實現所有驗證控制項都必須實現的通用屬性。下面介紹了一些常用驗證屬性。

  · ControlToValidate屬性

  該屬性值為String類型,其用於驗證控制項將計算的輸入控制項的編程ID。如果此為非法ID,則引發異常。

  · Display屬性

  該屬性值為ValidatorDisplay類型,其用於指定的驗證控制項的顯示行為。此屬性可以為下列值之一:(1)None—驗證控制項從不內聯顯示。如果希望僅在ValidationSummary控制項中顯示錯誤資訊,則使用此選項。(2)Static—如果驗證失敗,驗證控制項顯示錯誤資訊。即使輸入控制項通過了驗證,也在Web頁中為每個錯誤資訊分配空間。當驗證控制項顯示其錯誤資訊時,頁面配置不變。由於頁面配置是靜態,同一輸入控制項的多個驗證控制項必須佔據頁上的不同物理位置。(3)Dynamic—如果驗證失敗,驗證控制項顯示錯誤資訊。當驗證失敗時,在頁上動態分配錯誤資訊的空間。這允許多個驗證控制項共用頁面上的同一個物理位置。注意:由於驗證控制項的空間是動態建立的,所以頁面的物理布局會發生更改。為了防止頁面配置在驗證控制項變得可見時更改,必須調整包含驗證控制項的HTML元素的大小,使其大得足以容納驗證控制項的最大大小。

  · ErrorMessage屬性

  該屬性值為String類型,其用於當驗證失敗時,在ValidationSummary控制項中顯示的錯誤資訊。如果未設定驗證控制項的Text屬性,則驗證失敗時,驗證控制項中仍顯示此文本。ErrorMessage屬性通常用於為驗證控制項和ValidationSummary控制項提供各種訊息。注意:此屬性不會將特殊字元轉換為HTML實體。例如,小於符號字元(<)不轉換為<。這允許將HTML元素(如<IMG>元素)嵌入到該屬性的值中

  · IsValid屬性

  該屬性值為bool類型,其用於指示ControlToValidate屬性所指定的輸入控制項是否被確定為有效。

  由該類派生的驗證控制項,可以不必再次實現以上通用屬性,而只要根據應用需要另外定義一些屬性和驗證邏輯即可。例如,對於RangeValidator控制項,除具有以上通用屬性外,還定義了用於限定取值範圍的MinimumValue和MaximumValue屬性,以及用於指定要比較的值的資料類型的Type屬性。此外,該控制項的驗證邏輯是通過重寫BaseValidator.EvaluateIsValid方法實現的。由此看來,BaseValidator簡化了自訂驗證控制項的實現過程,為控制項開發人員提供了方便。

  CustomValidator派生自BaseValidator類,它是5個內建驗證控制項之一。通常情況下,頁面開發人員使用CustomValidator來添加自訂的驗證邏輯,這隻要通過定義ServerValidate事件的事件處理方法以及ClientValidationFunction屬性來完成。由於CustomValidator不提供複用機制(訪問屬性為public),因此自訂驗證控制項不能自該類派生。

  (2)用戶端實現機制

  上文介紹了為實現驗證控制項,開發人員必須掌握的3個核心對象。掌握這些對象的定義和使用方法對於開發驗證控制項具有重要意義。通過它們,我們可以在伺服器驗證中添加驗證邏輯。當頁面回傳時,驗證目標控制項的輸入資料被發往伺服器端參與驗證邏輯。如果輸入資料不能滿足驗證條件,那麼頁面將重新呈現,並且要求使用者再次進行輸入。整個驗證過程可能需要多次往返,這樣必然降低應用程式的易用性,並給伺服器增加負擔。

  為瞭解決以上問題,開發人員必須學會為驗證控制項添加用戶端驗證機制。如果使用者的瀏覽器支援DHTML和JavaScript技術,並且頁面和驗證控制項的EnableClientScript均設定為true,那麼就可以在用戶端執行驗證。用戶端驗證通過在向伺服器發送使用者輸入前,檢查使用者輸入、改變一些頁面效果來增強驗證過程。例如,通過在用戶端檢測輸入錯誤,從而避免伺服器端驗證所需要的資訊來回傳遞。伺服器端驗證總是要被執行的,這看起來好像是與用戶端驗證產生了重複,實際不然。出於安全考慮,如果某些使用者通過手工提交惡意資料,而繞過用戶端驗證,那麼伺服器端驗證的執行將對保護應用程式的安全性,甚至為伺服器的安全性提供有力支援。

  在ASP.NET 2.0中,如果開發人員使用內建驗證控制項實現驗證功能,那麼ASP.NET 2.0將自動產生相關的JavaScript代碼。如果開發人員查看相關HTML原始碼,那麼將會發現有些來自WebResource.axd的JavaScript檔案連結。然而,我們是無法查看相關檔案代碼的。這一點與ASP.NET 1.x不同。在ASP.NET 1.x中,預設情況下,在目錄“C:\Inetpub\wwwroot\aspnet_client\system_web\版本號碼”中包含一個WebUIValidation.js檔案。該檔案中包括了實現用戶端驗證的JavaScript代碼。開發人員可以通過閱讀這些代碼來瞭解驗證功能的具體實現方法。ASP.NET 2.0中沒有存在相關的原始碼檔案,而是通過WebResource.axd等機制來實現。

  有關實現用戶端驗證的內容,主要涉及實現用戶端功能等知識。這些內容在前面的文章中已經詳細進行了講解。有興趣的讀者可閱讀有關文章。

   3. 小結

  本文主要介紹了內建驗證控制項,以及自訂驗證控制項實現機制。實際上,如果讀者開發自行實現驗證控制項時,將會發現這個過程需要很多知識。例如,伺服器端程式設計語言、JavaScript、CSS、DHTML等等。因此,如果讀者希望建立高品質的驗證控制項,那麼不僅要瞭解相關知識,而且必須達到精通的水平。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.