サーバー ページにコールバックを送信して結果を受け取るという 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>