AJAX 技術が提唱するリフレッシュフリー コールバックでは、独自技術で大量の JavaScript コードを記述するか、一部の AJAX フレームワークを使用する必要があり、開発効率と保守性が大幅に低下します。実際、ASP.NET2.0 では、ICallbackEventHandler というそのようなインターフェイスがすでに提供されています。
インターネット上には ICallbackEventHandler に関する記事がすでにたくさんありますが、この記事はさらに詳しく説明します。
ICallbackEventHandler は System.Web.UI に存在します。非常に簡単な例で試してみましょう。
最初のステップは、VS2005 で新しい WEB ウィンドウを作成することです。
2 番目のステップは、HTML コード (以下) を ASPX に挿入することです。
1<本体>
2 <form id="form1" runat="server">
3 <div>
4 <button onclick="CallServer()">コールサーバー</button>
5 </div>
6 </form>
7</body>
3 番目のステップは、JavaScript スクリプトを <HEAD></HEAD> に配置することです。
1 <script type="text/javascript">
2 関数 CallServer()
3 {
4 var product = "テスト";
5 <%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%>;
6}
7
8 functionReceiveServerData(rValue)
9 {
10 アラート(rValue);
11 }
12 </スクリプト>
4 番目のステップは、ASPX のバックグラウンド CS コードで ICallbackEventHandler インターフェイスを継承し、インターフェイスに次の 2 つのメソッドを実装することです。
ICallbackEventHandler.GetCallbackResult()
そして
ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
5 番目のステップは、変数 CallBackValue を追加し、インターフェイスの 2 つのメソッドを次のように変更することです。
1 プライベート文字列 CallBackValue = string.Empty;
2
3 文字列 ICallbackEventHandler.GetCallbackResult()
4 {
5 return CallBackValue + ",ok";
6}
7
8 void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
9 {
10 this.CallBackValue = イベント引数;
11 }
12
6 番目のステップは実行です。クリックすると、文字列「Test」がバックグラウンドに送信され、文字列に「, OK」が追加され、クライアントの JavaScript に返されます。コードを入力して表示します。
上記の 6 つの手順に従うことで、リフレッシュ不要のコールバックを実現できます。次に、いくつかのコードを分析してみましょう。
まず、3 番目のステップの JavaScript コードを見てみましょう。CallServer() メソッドには次のようなコールバックがあります。
<%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%>;
4 つのパラメーターのうち 2 番目のパラメーターは製品 JavaScript 内の文字列変数をバックグラウンドに返すことを指定し、3 番目のパラメーターはバックグラウンドから戻るときに戻り情報を受け取る JavaScript メソッド ReceiveServerData(string Value) を指定します。
5 番目のステップでは、バックグラウンドに 2 つのメソッドがあります。1 つは、フォアグラウンド JavaScript で渡された文字列変数を受け取り、それを内部変数 this.CallBackValue に割り当てるために使用されます。 ICallbackEventHandler.GetCallbackResult() は、内部変数 this.CallBackValue を変更し、フォアグラウンド JavaScript メソッド ReceiveServerData(string Value) に返されます。
呼び出しシーケンスは次のとおりです: (フロントエンド)CallServer() --> (バックエンド)ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) --> (バックエンド)ICallbackEventHandler.GetCallbackResult() --> (フロントエンド)ReceiveServerData(string Value)。
呼び出しプロセス全体は非常に簡単で、最も重要なステップは 3 番目のステップです。
<%= ClientScript.GetCallbackEventReference(this, "product", "ReceiveServerData",null)%>;
この方法については、以下のような情報がインターネット上にありますので、参考にしてみてください。
GetCallbackEventReference により、クライアント リクエストの終了時にクライアント メソッドがリサイクルされます。 また、CallBackManager がどのコールバック メソッドを生成するかを決定できるようになります。 この例で使用されるオーバーロードされたメソッドは次のとおりです。
public string GetCallbackEventReference(
文字列ターゲット、文字列引数、
文字列 clientCallback、文字列コンテキスト、
文字列 clientErrorCallback)
表 1. GetCallBackEventReference メソッドのパラメーターの説明。
パラメータ 説明 コールバック呼び出しが処理されるページのターゲット ID。詳細については、次のセクションで使用できる他のオーバーロードされたオプションを参照してください。このサンプルでは、コールバックが同じページで処理されるため、「this」は引数値です。値をサーバーに送信するために使用されるパラメーター定義です。この値は、RaiseCallbackEvent イベントを使用してサーバー側のパラメーター「eventArgument」によって受信されます。「arg」は、サンプルの最初のパラメーター名になります。 clientCallback サーバー呼び出しが成功した後に呼び出されるコールバックのメソッド名。「CallBackHandler」は、クライアントからの「引数」に関連付けられたメソッド名です。呼び出しのコンテキストを識別します。これは、サンプル実装からよりよく理解できます。サンプルでは、「ctx」は、クライアントから呼び出されるメソッドの名前として渡されます。エラーが発生した場合は CallBackManager を呼び出します。
このメソッドから返される文字列は次のとおりです。
__doCallback('__Page',arg,CallBackHandler,ctx, ErrorCallBack)
もう 1 つのオーバーロードされたメソッドは次のとおりです。
public string GetCallbackEventReference(
コントロール制御、文字列引数、
文字列 clientCallback、文字列コンテキスト)
パブリック文字列 GetCallbackEventReference(
コントロール制御、文字列引数、
文字列 clientCallback、文字列コンテキスト、
文字列 clientErrorCallback)