【ASP.NET】クライアント・コールバック (Client Call Back)

クライアント・コールバックとは

ページをリロードせずにサーバーとやり取りする方法。
ポストバックによるパフォーマンスの低下を避ける方法として、クライアントコールバックを使ってサーバーのコードを実行できる。

ライアント・コールバックを利用するため

【1】ICallbackEventHandlerインターフェイスを実装する

RaiseCallbackEvent()

コールバックによる実処理を規定するためのメソッド

【2】GetCallbackEventReferenceメソッドでクライアント関数への参照を取得する

GetCallbackResult()

クライアントサイド・スクリプトによる関数への参照を取得する

構文

GetCallbackEventReference(
  ICallbackEventHandlerインターフェイスを実装したコントロール,
  RaiseCallBackメソッドに渡す値を表すクライアントサイド・スクリプト,
  コールバック関数の名前(クライアントサイド・スクリプトで定義),
  コールバック関数に引き渡すコンテキスト値
) 

サンプル

' 【2】ボタンのクリック時にコールバック発生させる
' (sampleCallbackを呼び出す)スクリプトを埋め込み
Dim ceRef As String = _
    Me.Page.ClientScript.GetCallbackEventReference( _
      Me, _ ' ICallbackEventHandlerインターフェイスを実装したコントロール
      "document.getElementById('TextBox1').value", _ ' RaiseCallBackメソッドに渡す値を表すクライアントサイド・スクリプト
      "sampleCallback", _ ' コールバック関数の名前
      "null") ' コールバック関数に引き渡すコンテキスト値
Button1.OnClientClick = ceRef & ";return false;"

使用上の注意

 * GetCallbackEventReference()によって生成されたJavaScriptコードの末尾には、必ず「return false;」という1文を追加すること(明示的にクリック・イベントの発生を抑制するため)

【3】クライアント側の処理関数を定義する

GetCallbackEventReferenceメソッドの第2パラメータに、クライアント側の処理関数を定義する。

 コールバック関数は、
第1パラメータとしてGetCallbackResultメソッドからの処理結果
第2パラメータとしてGetCallbackEventReferenceメソッドで指定されたコンテキスト値を受け取る。

使用上の注意

 * クライアントコールバックを使用してもPage_Loadは発生する(クライアントコールバックの場合は、IsCallBackプロパティがTrueとなる)

サンプル

Public Class WebForm1
    Inherits System.Web.UI.Page
    ' 【1】コールバックするためのインターフェイスを宣言
    Implements System.Web.UI.ICallbackEventHandler

    ' コールバックのやり取りに使用する変数の定義
    Private result As String

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim cs As ClientScriptManager

        ' 【3】クライアントにコールバックの値を受け取るスクリプトを埋め込み(sampleCallbackを定義)
        cs = Me.ClientScript

        Dim script As StringBuilder = New StringBuilder()
        script.Append("<script language='javascript' type='text/javascript'>")
        script.Append("function sampleCallback(result, context) {")
        script.Append("  document.getElementById('TextBox1').value = result;")
        script.Append("}")
        script.Append("</script>")

        cs.RegisterClientScriptBlock( _
            Me.GetType, "sampleCallback", script.ToString())

        ' 【2】ボタンのクリック時にコールバック発生させる
        ' (sampleCallbackを呼び出す)スクリプトを埋め込み
        Dim ceRef As String = _
            Me.Page.ClientScript.GetCallbackEventReference( _
              Me, _
              "document.getElementById('TextBox1').value", _
              "sampleCallback", _
              "null")
        Button1.OnClientClick = ceRef & ";return false;"
    End Sub

    ' コールバックで使用するイベント(値を返す)
    Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
        Return Me.result
    End Function

    ' 【1】コールバックで使用するイベント(呼び出されるイベント)
    Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
        Select Case eventArgument
            Case "1"
                Me.result = eventArgument & "が押されました。ワン。"
            Case "2"
                Me.result = eventArgument & "が押されました。ツー。"
            Case "3"
                Me.result = eventArgument & "が押されました。さーん。"
            Case Else
                Me.result = eventArgument & "が押されました。その他~。"
        End Select
    End Sub

End Class

参考文献

http://d.hatena.ne.jp/haradago/20100423/p1


関連記事

ポストバック (POST BACK)

http://blogs.yahoo.co.jp/dk521123/25733205.html