次の方法で共有


検証コントロールの開発

このセクションでは、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 クラスは、ページ上のすべての IValidator タイプの一覧である Validators プロパティを公開します。IValidator インターフェイスを実装するクラスは検証コントロールと考えられ、格納するページの Validators プロパティに追加できます。ページは、検証コントロールのエラー状態を記録し、その記録に従って自身の全般的なエラー状態を更新します。

最も一般的な検証コントロールのタイプは、クライアントに UI をレンダリングして入力エラーのフラグを立てる検証コントロールです。.NET Framework SDK と共に出荷される検証コントロールについては、「ASP.NET クイック スタート」の「サーバー コントロールのフォーム検証」を参照してください。.NET Framework の検証コントロールの特性の要約を次に示します。これは、検証コントロール ライブラリを構築する場合に役立ちます。

  • 検証コントロールは、検証対象のコントロールとは別です。検証に参加するには、サーバー コントロールは、ValidationPropertyAttribute に設定することによって検証するプロパティを公開する必要があります。
  • 複数の検証コントロールを 1 つの入力コントロールと関連付けることができます。
  • ページ開発者は、検証コントロールの外観とエラー メッセージをカスタマイズできます。
  • 検証コントロールはスクリプトに対応しており、サーバー上と同様にクライアント (上位レベル) 上で同じエラー チェックを実行します。
  • 上位のクライアント上では、検証コントロールは、サーバーへの繰り返し問い合わせなしに入力エラーを表示します。フィールドごとの検証エラーは、ユーザーが別のフィールドに移動すると同時にクライアント上に表示され、ユーザーがフォームを送信するときに、必要なフィールド検証エラーとエラー概要が表示されます。
  • ページ開発者は、検証コントロールによって実行されるクライアント側エラー チェックを補う、または入れ替えるクライアント側スクリプトを提供できます。

共通検証機能は、System.Web.UI.WebControls.BaseValidator 抽象基本クラスによって実装され、IValidator を実装し、ページにクライアント側スクリプトを登録し、基本レンダリング ロジックを提供します。RequiredFieldValidatorRegularExpressionValidatorCustomValidator などの各具象検証クラスは、BaseValidator から派生し、独自の特定機能を追加します。検証エラー メッセージの概要は、ValidationSummary コントロールが提供します。ValidationSummary 自身は検証コントロールではなく (IValidator を実装せず)、WebControl から派生しています。ValidationSummary は、ページの 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. 検証コントロールとパッケージ化されるクライアント側スクリプト ライブラリを準備してサーバー上の適切なディレクトリに配置します。これによって、他のアプリケーションからも利用できますがバージョンの競合は発生しません。詳細については、「サーバー コントロールのクライアント側機能」を参照してください。スクリプト ライブラリの例については、「検証コントロールのスクリプト ライブラリのサンプル」を参照してください。

  8. クライアント側スクリプトを出力する Page のメソッドを呼び出します。詳細については、「サーバー コントロールのクライアント側機能」の説明と「基本検証コントロールのサンプル」の実装を参照してください。これらのスクリプト メソッドは、PreRender メソッドおよび Render メソッドから呼び出します。

  9. AddAttributestoRender メソッドと Render メソッドをオーバーライドすることによって、レンダリング ロジックを実装します。例については、「基本検証コントロールのサンプル」の実装を参照してください。

ここで示したすべての手順は、「基本検証コントロールのサンプル」で実装されます。

参照

検証コントロールのサンプル | サーバー コントロールのクライアント側機能