次の方法で共有


ポストバック データの処理

クライアントからポストバックされたフォーム データをコントロールで確認できるようにするには、そのコントロールに System.Web.UI.IPostBackDataHandler インターフェイスを実装する必要があります。このインターフェイスのコントラクトにより、コントロールは、ポストバックの結果としてコントロールの状態を変更する必要があるかどうかを判断し、適切なイベントを発生させることができます。IPostBackDataHandler インターフェイスには、2 つのメソッドが含まれています。

public interface IPostBackDataHandler{
   public bool LoadPostData(stringpostDataKey, 
                           NameValueCollection postCollection);
   public void RaisePostDataChangedEvent();
}
[Visual Basic]
Public Interface IPostBackDataHandler
   Public Function LoadPostData(postDataKey As String, _
            postCollection As NameValueCollection) As Boolean
   Public Sub RaisePostDataChangedEvent()
End Interface

ポストバックされた時点で、ページ フレームワークはポストされた内容を検索し、IPostBackDataHandler を実装するサーバー コントロールの UniqueID と一致する値があるかどうかを判断します。次に、このインターフェイスを実装するそれぞれのコントロールの LoadPostData を順に呼び出します。LoadPostData の 2 つの引数は、コントロールおよびコレクションを識別するキーと、ポストされたデータを格納する NameValueCollection です。LoadPostData は、通常、ポストバックの結果としてコントロールの状態を更新するために実装されます。カスタム テキスト ボックス コントロールのための LoadPostData の実装例を次に示します。

public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
    string presentValue = Text;
    string postedValue = postCollection[postDataKey];
    
    if (!presentValue.Equals(postedValue)){
          Text = postedValue;
          return true;
    }
    return false;
}
[Visual Basic]
Public Overridable Function LoadPostData(postDataKey As String, postCollection As NameValueCollection) As Boolean
   Dim presentValue As String = Text
   Dim postedValue As String = postCollection(postDataKey)
   If Not presentValue.Equals(postedValue) Then
      Text = postedValue
      Return True
   End If
   Return False
End Function
      

ポストバックの結果としてコントロールの状態が変更された場合、LoadPostDatatrue を返します。それ以外の場合は false を返します。ページ フレームワークは、true を返すすべてのコントロールを追跡し、true を返したコントロールの RaisePostDataChangedEvent を呼び出します。Change イベント (存在する場合) は、このメソッドによって発生します。このように、ポストバック データの処理は、状態更新と変更通知発生の 2 つのフェーズで実行されます。これにより、ポストバック データ読み込み中に変更通知が発生するのを防ぐことができます。読み込み中に変更通知が発生すると、すべてのコントロールにポストバック データが読み込まれる前に、通知によって誤って状態が変更される可能性があります。カスタム テキスト ボックス コントロールのための RaisePostDataChanged の実装のコードを次に示します。

public virtual void RaisePostDataChangedEvent() {
            OnTextChanged(EventArgs.Empty);      
      }
[Visual Basic]
Public Overridable Sub RaisePostDataChangedEvent()
   OnTextChanged(EventArgs.Empty)
End Sub

レンダリング ロジックで、コントロールの名前属性に必ず UniqueID を割り当ててください。UniqueID を割り当てないと、ページ フレームワークは、ポストバック データをコントロールにルーティングできません。コントロールが複数のフォーム要素を出力する場合は、少なくとも 1 つの要素に、そのコントロールの UniqueID と一致する名前属性を割り当てる必要があります。複数のフォーム フィールドを出力するカスタム コントロールの例については、「コンポジションとレンダリング」を参照してください。名前属性に UniqueID を割り当てるコードを次に示します。

protected override void Render(HtmlTextWriter output) 
{
output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
output.AddAttribute(HtmlTextWriterAttribute.Value, this.Text);
output.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
output.RenderBeginTag(HtmlTextWriterTag.Input);
output.RenderEndTag();
}
[Visual Basic]
Protected Overrides Sub Render(output As HtmlTextWriter)
output.AddAttribute(HtmlTextWriterAttribute.Type, "text")
output.AddAttribute(HtmlTextWriterAttribute.Value, me.Text)
output.AddAttribute(HtmlTextWriterAttribute.Name, me.UniqueID)
output.RenderBeginTag(HtmlTextWriterTag.Input)
output.RenderEndTag()
End Sub

ポストバック データ処理に参加するカスタム テキスト ボックス コントロールのサンプルについては、「ポストバック データ処理のサンプル」を参照してください。

参照

ポストバック データ処理のサンプル