Share via


ASP.NET Web ページでポストバックせずにプログラムによってクライアント コールバックを実装する

更新 : 2007 年 11 月

ASP.NET Web ページの既定のモデルでは、ユーザーがページとやり取りし、ボタンをクリックし、ポストバックを発生するその他のアクションを実行します。ページおよびそのコントロールが再作成され、ページのコードがサーバーで実行され、ページの新しいバージョンがブラウザにレンダリングされます。ただし、ポストバックを実行せずにクライアントからサーバー コードを実行する方が便利な場合もあります。ページのクライアント スクリプトがローカル変数値などのステータス情報を維持している場合、ページをポストして新しいコピーを取得すると、ステータス情報が破壊されます。さらに、ページのポストバックによって処理オーバーヘッドが発生するため、パフォーマンスが低下し、ユーザーはページが処理され、再作成されるまで待たなければならなくなります。

クライアントの状態の消失を回避し、サーバーとのやり取りによる処理オーバーヘッドが発生しないようにするために、クライアント コールバックを実行できるように ASP.NET Web ページのコードを記述します。クライアント コールバックでは、クライアント スクリプト関数は要求を ASP.NET Web ページに送信します。Web ページは、通常の有効期間が変更されたバージョンを実行します。ページが初期化され、コントロールおよびその他のメンバが作成され、特別にマークされたメソッドが呼び出されます。このメソッドは、独自のコードを記述した処理を実行し、別のクライアント スクリプト関数が読み取ることができる値をブラウザに返します。このプロセスの間、ページはブラウザでアクティブになります。

いくつかの Web サーバー コントロールでは、クライアント コールバックを使用できます。たとえば、TreeView コントロールはクライアント コールバックを使用して、オンデマンド設定機能を実装します。詳細については、「TreeView Web サーバー コントロールの概要」を参照してください。

ASP.NET Web ページでクライアント コールバックを自動化するには、いくつかの方法があります。ASP.NET の AJAX 機能 (UpdatePanel サーバー コントロールなど) では非同期の部分ページ更新を自動化でき、Web サービス通信機能では非同期 Web サービス呼び出しを自動化できます。

クライアント コールバックを自動化する ASP.NET の AJAX 機能の概要については、次のトピックを参照してください。

独自のクライアント スクリプトを記述して、クライアント コールバックを直接実装することもできます。ここでは、クライアントとサーバーの間で非同期通信を行うために独自のクライアント コールバックを実装する方法について説明します。

クライアント コールバックのコンポーネント

プログラムによってクライアント コールバックを実装する ASP.NET ページの作成は、以下に示すいくつかの違いを除いて通常の ASP.NET ページの作成と同じです。ページのサーバー コードは次のタスクを実行する必要があります。

  • ICallbackEventHandler インターフェイスを実装します。このインターフェイスの宣言は、任意の ASP.NET Web ページに追加できます。

  • RaiseCallbackEvent メソッドを実装します。サーバーからコールバックを実行するためにこのメソッドが呼び出されます。

  • GetCallbackResult メソッドを実装します。このメソッドはコールバック結果をクライアントに返します。

さらに、ページには次のアクションを実行する 3 つのクライアント スクリプト関数を含める必要があります。

  • 最初の関数は、サーバーに実際に要求を行うヘルパー メソッドを呼び出します。この関数では、まずカスタム ロジックを実行してイベント引数を準備できます。次に、パラメータとして文字列をサーバー側のコールバック イベント ハンドラに送信します。

  • 2 番目の関数は、コールバック イベントを処理したサーバー コードから呼び出され、結果を表す文字列を受け取ります。これは、クライアント コールバック関数と呼ばれます。

  • 3 番目の関数は、サーバーに実際に要求を行うヘルパー関数です。この関数は、サーバー コードで GetCallbackEventReference メソッドを使用してこの関数への参照を生成するときに、ASP.NET によって自動的に生成されます。

クライアント コールバックとポストバックは、両方とも発生元のページに対する要求です。したがって、クライアント コールバックとポストバックはページ要求として Web サーバー ログに記録されます。

サーバー コードへの必要なインターフェイスの実装

ポストバックを実行せずにクライアント スクリプトからサーバー コードを実行するには、サーバー コードに複数のインターフェイスを実装する必要があります。

ICallbackEventHandler インターフェイスの宣言

ページのクラス宣言の中で ICallbackEventHandler インターフェイスを宣言できます。分離コード ページを作成する場合は、次のような構文を使用してインターフェイスを宣言できます。

Partial Class CallBack_DB_aspx
    Inherits System.Web.UI.Page
    Implements System.Web.UI.ICallbackEventHandler
public partial class CallBack_DB_aspx : 
    System.Web.UI.Page, System.Web.UI.ICallbackEventHandler

単一ファイル ページまたはユーザー コントロールを作成する場合は、次の例のように、ページで @ Implements ディレクティブを使用して宣言を追加します。

<%@ Page Language="VB" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
ms178208.alert_note(ja-jp,VS.90).gifメモ :

インターフェイス名では、大文字と小文字が区別されます。

サーバー コールバック メソッドの作成

サーバー コードで、RaiseCallbackEvent メソッドを実装するメソッドと、GetCallbackResult メソッドを実装するメソッドを作成する必要があります。RaiseCallbackEvent メソッドは、イベント ハンドラで一般に使用される 2 つの引数の代わりに 1 つの文字列引数を受け取ります。このメソッドの一部を次の例に示します。

Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
    Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

End Sub
public void RaiseCallbackEvent(String eventArgument)
{

}

GetCallbackResult メソッドは、引数を受け取らず、文字列を返します。このメソッドの一部を次の例に示します。

Public Function GetCallbackResult() As String Implements _
    System.Web.UI.ICallbackEventHandler.GetCallbackResult
    Return aStringValue
End Function
public string GetCallbackResult()
{
    return aStringValue;
}

クライアント スクリプト関数の作成

サーバー ページにコールバックを送信して結果を受け取るという 2 つの機能を実行するクライアント スクリプト関数をページに追加する必要があります。この 2 つのクライアント スクリプト関数は、ECMAScript (JavaScript) で記述されます。

コールバックの送信

コールバックを送信する関数はサーバー コードで生成されます。実際のコールバックは、ICallbackEventHandler インターフェイスを実装するすべてのページで使用できるライブラリ関数によって実行されます。ページの GetCallbackEventReference メソッドを呼び出して、ライブラリ関数の参照を取得できます。このメソッドには、そのページの ClientScript プロパティからアクセスできます。GetCallbackEventReference メソッドからの戻り値への呼び出しを含むクライアント関数を動的に作成します。このメソッドには、ページへの参照、データを渡すために使用する引数の名前、コールバック データを受け取るクライアント スクリプト関数の名前、および必要なコンテキストを渡す引数を渡します (C# では this、Visual Basic では Me)。

関数の作成が完了したら、RegisterClientScriptBlock メソッドを呼び出してページに挿入します。

CallServer という関数を動的に作成してからコールバックを呼び出す方法を次の例に示します。

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
    Dim cm As ClientScriptManager = Page.ClientScript
    Dim cbReference As String
    cbReference = cm.GetCallbackEventReference(Me, "arg", _
        "ReceiveServerData", "")
    Dim callbackScript As String = ""
    callbackScript &= "function CallServer(arg, context)" & _
        "{" & cbReference & "; }"
    cm.RegisterClientScriptBlock(Me.GetType(), _
        "CallServer", callbackScript, True)End Sub
void Page_Load(object sender, EventArgs e)
{
    ClientScriptManager cm = Page.ClientScript;
    String cbReference = cm.GetCallbackEventReference(this, "arg",
        "ReceiveServerData", "");
    String callbackScript = "function CallServer(arg, context) {" +
        cbReference + "; }";
    cm.RegisterClientScriptBlock(this.GetType(),
        "CallServer", callbackScript, true);
}

作成している関数が受け取る引数の名前が GetCallbackEventReference メソッドに渡す値の名前に一致していることが必要です。

コールバックを呼び出して、その戻り値を処理するために使用できるマークアップを次の例に示します。

<input type="button" value="Callback" 
    onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>
<input type="button" value="Callback" 
    onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>

コールバックの受け取り

ページで静的にコールバックを受け取るクライアント関数を記述できます。この関数の名前は、GetCallbackEventReference メソッドへの呼び出しで渡す名前に一致させる必要があります。この受け取り関数は、2 つの文字列値を受け取ります。1 つは戻り値で、もう 1 つはサーバーから返されるコンテキスト値です (省略可能)。

この関数は、次の例のようになります。

<script type="text/javascript">
function ReceiveServerData(arg, context)
{
    Message.innerText = 'Processed callback.';
}
</script>

参照

概念

クライアント コールバックの実装例 (Visual Basic)

クライアント コールバックの実装例 (C#)

参照

ClientScriptManager