共用方式為


開發驗證器控制項

這個章節將說明 ASP.NET 網頁架構中的驗證,以及說明如何開發您自己的驗證器控制項程式庫。

驗證通常包括檢查使用者輸入的資料。然而,它也可以包括其他類型的錯誤檢查。為提供包括驗證的不同案例,.NET Framework 定義了 System.Web.UI.IValidator 介面,其中包含下列成員。

public interface IValidator
{
   void Validate();
   string ErrorMessage {get; set;}
   bool IsValid {get; set;}
}
[Visual Basic]
Public Interface IValidator
   Sub Validate()
   Property ErrorMessage As String
   Property IsValid As Boolean
End Interface

Validate 方法會執行錯誤檢查邏輯並設定 IsValid 屬性。ErrorMessage 屬性含有一個由網頁開發人員提供的錯誤字串。

Page 類別會公開 Validators 屬性,其中含有網頁上所有 IValidator 型別的清單。任何實作 IValidator 介面的類別將被視為驗證器,且可以加入包含網頁的 Validators 屬性。網頁會追蹤驗證器式的錯誤狀態,並依據追蹤結果更新它自己的整體錯誤狀態。

大部份的通用驗證器型別是屬於呈現 UI 於用戶端上以指出輸入錯誤的驗證器控制項。如需 .NET Framework SDK 隨附的驗證器控制項資訊,請參閱 ASP.NET 快速入門 -> ASP.NET Web Form -> 伺服器控制項表單驗證。下列將列出 .NET Framework 中的驗證器控制項摘要特性,以助於建置 (Build) 驗證器控制項程式庫。

  • 驗證器控制項和它們要驗證的控制項是各自獨立的。(若要參和驗證,伺服器控制項必須公開已標記上 ValidationPropertyAttribute 的屬性才可驗證)。
  • 多重驗證器控制項可以和一個輸入控制項建立關聯。
  • 驗證器控制項的外觀和錯誤訊息可以由網頁開發人員自訂。
  • 驗證器控制項在 (上層) 用戶端以及伺服器上已啟用指令碼且執行相同的錯誤檢查。
  • 在上層用戶端上,驗證器控制項會顯示輸入錯誤而不需往返伺服器。當使用者移至不同的欄位時,即會在用戶端上顯示該欄位的驗證錯誤,而當使用者送出表單時,也可顯示相對的欄位驗證錯誤和錯誤摘要。
  • 網頁開發人員可以提供用戶端指令碼以補充或取代由驗證器控制項所執行的用戶端錯誤檢查。

一般的驗證功能是由抽象基底類別 System.Web.UI.WebControls.BaseValidator 實作,它會實作 IValidator、將用戶端指令碼和網頁一起註冊以及提供基底呈現邏輯。RequiredFieldValidatorRegularExpressionValidatorCustomValidator 之類的具體驗證器類別是衍生自 BaseValidator 並會加入本身特定的功能。ValidationSummary 控制項提供了驗證錯誤訊息的摘要。ValidationSummary 本身並不是一個驗證器 (它不會實作 IValidator) 且衍生自 WebControlValidationSummary 會存取網頁的 Validators 集合以取得和網頁一起註冊的每一個驗證器其錯誤訊息。

如果您已經安裝 .NET Framework SDK 或 Visual Studio .NET,您可以在虛擬根目錄 aspnet_client/system_web/<version of SDK installed> 中的檔案,查看由 BaseValidator 發出的指令碼程式庫。如需發出用戶端指令碼的詳細資訊,請參閱伺服器控制項中的用戶端功能

下列內容將說明開發驗證器控制項的關鍵步驟,驗證器控制項可提供基本的驗證功能。當您想開發自訂驗證器程式庫或自訂驗證器控制項的基底驗證器控制項,以提供所有必要的驗證功能時,請依照這些步驟執行。當您是使用較簡單的方式,例如擴充現有的驗證器時,則不需要實作這些步驟。在這種情形下,請參閱驗證器控制項範例中的擴充基底驗證器範例。

若要實作驗證器

注意 下列清單中的步驟 1-4 通用於所有的驗證器,包括不屬於控制項的伺服器端驗證器類別。步驟 5-10 則用於提供 UI 和發出用戶端指令碼的控制項。

  1. 定義一個將實作 IValidator 的類別。如果驗證器是屬於控制項,則它必須直接或間接衍生自 Control。下列範例將說明 .NET Framework 中衍生自 System.Web.UI.WebControls.Label 的驗證器控制項。

    public abstract class BaseDomValidator : Label, IValidator {...}
    [Visual Basic]
    MustInherit Public Class BaseDomValidator
       Inherits Label
       Implements IValidator
       ... 
    End Class
    

    注意 除了作為基底類別之外,您的驗證器並不需要是抽象的。

  2. 實作 IValidator 的合約。下列範例將說明如何實作 IValidator。同時請參閱基底驗證器控制項範例

    public string ErrorMessage {
                get {
                    object o = ViewState["ErrorMessage"];
                    return((o == null) ? String.Empty : (string)o);
                }
                set {
                    ViewState["ErrorMessage"] = value;
                }
            }
    public bool IsValid {
                get {
                    return isValid;
                }
                set {
                    isValid = value;
                }
            }
    public void Validate() {
    ...
    // A base validator cannot supply all the validating logic.
    // You can implement common functionality here and invoke an 
    // abstract method that is overridden by derived classes to
    // provide validation logic.
                IsValid = EvaluateIsValid();
            }
    
    // This method is overridden by a concrete class that extends 
    // the base validator to supply specific validation logic.
    protected abstract bool EvaluateIsValid();    
    [Visual Basic]
    Public Property ErrorMessage() As String Implements IValidator.ErrorMessage
       Get
          Dim o As Object = ViewState("ErrorMessage")
          If o Is Nothing Then
             Return String.Empty
          Else
             Return CStr(o)
          End If
       End Get
       Set
          ViewState("ErrorMessage") = value
       End Set
    End Property
    
    Public Property IsValid() As Boolean Implements IValidator.IsValid
       Get
          Return _isValid
       End Get
       Set
          _isValid = value
       End Set
    End Property
    
    Public Sub Validate() Implements IValidator.Validate
       ...
       ' A base validator cannot supply all the validating logic.
       ' You can implement common functionality here and invoke an 
       ' abstract method that is overridden by derived classes to
       ' provide validation logic.
       IsValid = EvaluateIsValid()
    End Sub
    
    ' This method is overridden by a concrete class that extends 
    ' the base validator to supply specific validation logic.
    Protected MustOverride Function EvaluateIsValid() As Boolean
    
  3. 當以覆寫下列的 OnInit 方法初始化網頁時,將驗證器加入至包含網頁的 Validators 屬性。

    protected override void OnInit(EventArgs e) {
                base.OnInit(e);
                Page.Validators.Add(this);
            }    
    [Visual Basic]
    Protected Overrides Sub OnInit(e As EventArgs)
       MyBase.OnInit(e)
       Page.Validators.Add(Me)
    End Sub    
    

    注意 當您的驗證器不屬於控制項時,則必須由網頁開發人員在 Page_Load 方法中執行這個步驟。

  4. 當以覆寫下列的 OnUnload 方法卸載網頁時,將驗證器從包含網頁的 Validators 屬性中移除。

    protected override void OnUnload(EventArgs e) {
                if (Page != null) {
                    Page.Validators.Remove(this);
                }
                base.OnUnload(e);
            }    
    [Visual Basic]
    Protected Overrides Sub OnUnload(e As EventArgs)
       If Not (Page Is Nothing) Then
          Page.Validators.Remove(Me)
       End If
       MyBase.OnUnload(e)
    End Sub    
    

    注意 當您的驗證器不屬於控制項時,則必須由網頁開發人員在 Page_Unload 方法中執行這個步驟。

  5. 定義一個屬性以允許使用者將要驗證的輸入控制項和驗證器建立關聯。在 ASP.NET 驗證器控制項中,這個屬性的名稱是 ControlToValidate;它的定義方式如基底驗證器控制項範例中所述。

  6. 定義一個屬性以允許使用者選擇控制項是否應發出用戶端指令碼。在 ASP.NET 驗證器控制項中,這個屬性的名稱是 EnableClientScript;它的定義方式如基底驗證器控制項範例中所述。

  7. 準備將用戶端指令碼程式庫和您的驗證器控制項封裝 (Package) 在一起,並放入伺服器上正確的目錄,使它可以由其他的應用程式使用且不會產生版本衝突。如需詳細的資訊,請參閱伺服器控制項中的用戶端功能中的說明。如需指令碼程式庫的範例資訊,請參閱驗證器的指令碼程式庫範例

  8. 叫用 Page 的方法以發出用戶端指令碼。如需詳細的資訊,請參閱伺服器控制項中的用戶端功能中的說明,並參閱基底驗證器控制項範例中的實作 (Implementation)。這些指令碼方法是從 PreRenderRender 方法中叫用。

  9. 覆寫 AddAttributestoRenderRender 方法以實作呈現邏輯。如需範例資訊,請參閱基底驗證器控制項範例中的實作。

此處所顯示的步驟都已在基底驗證器控制項範例中實作。

請參閱

驗證器控制項範例 | 伺服器控制項中的用戶端功能