ASP.NET Webページでは再送なしにクライアントコールバックをプログラミングで実現
10757 ワード
ASP.NET Webページのデフォルトモデルでは、ユーザーはページと対話し、ボタンをクリックするか、再送の原因となる他の操作を実行します.ページとそのコントロールが再作成され、サーバ上でページコードが実行され、新しいバージョンのページがブラウザに表示されます.ただし、再送を実行せずにクライアントからサーバコードを実行する必要がある場合があります.ページ内のクライアント・スクリプトがステータス情報(ローカル変数値など)を維持している場合、ページの送信とページの新しいコピーの取得はステータスを破壊します.また、ページの再送により、処理オーバーヘッドが発生し、パフォーマンスが低下し、ユーザーが処理を待機してページを再作成しなければなりません.
クライアントの状態が失われ、サーバの往復の処理オーバーヘッドが発生しないようにするには、ASP.NETウェブコードは、クライアントコールバックを実行できるようにします.クライアントコールバックでは、クライアントスクリプト関数はASPに向かう.NETページからリクエストが送信されます.このページは、通常のライフサイクルの変更バージョンで実行されます.これにより、ページが起動し、コントロールと他のメンバーが作成され、特別なタグのメソッドが呼び出されます.このメソッドは、コードに記述された処理プロセスを実行し、ブラウザに別のクライアントスクリプト関数で読み取ることができる値を返します.このプロセスでは、ページはブラウザに常駐します.
クライアントコールバックを使用できるWebサーバコントロールはいくつかあります.たとえば、
TreeView
コントロールは、クライアントコールバックを使用して、必要な入力機能を実現します.詳細については、TreeView Webサーバコントロールの概要を参照してください.
ASP.NET Webページでは、クライアントコールバックの自動処理に使用できるオプションがあります.ASP.NETのAJAX機能(例えば
UpdatePanel
サーバコントロール)は、非同期部のページング更新を自動的に完了し、そのWebサービス通信機能は、非同期Webサービス呼び出しを自動的に完了することができる.
ASPについてNETでクライアントコールバックを自動的に処理できるAJAX機能の概要については、以下を参照してください.
UpdatePanel Control Overview
また、クライアントコールバックを直接実現するために、独自のクライアントスクリプトを作成することもできます.このトピックでは、クライアントとサーバとの間で非同期通信を行うために、独自のクライアントコールバックを実現する方法について説明します.
クライアントコールバックコンポーネント
クライアントコールバックをプログラミングで実現するASPを作成する.NETページと任意のASPを作成する.NETページのプロセスは似ていますが、以下の違いもあります.このページのサーバー・コードでは、次のタスクを実行する必要があります.
ICallbackEventHandler
インターフェース.任意のASP.NET Webページにこのインタフェース宣言を追加します.
RaiseCallbackEvent
メソッドの実装.このメソッドは、サーバにコールバックを実行するために呼び出されます.
GetCallbackResult
メソッドの実装.このメソッドは、コールバック結果をクライアントに返します.
また、このページには、次の3つのクライアント・スクリプト関数が含まれている必要があります.
GetCallbackEventReference
メソッドがこの関数の参照を生成する場合、ASP.NETはこの関数を自動的に生成します.
クライアントコールバックとコールバックは、元のページに対するリクエストです.これにより、Webサーバログにページリクエストとして記録されます.
サーバコードで必要なインタフェースを実装
再送を実行せずにクライアント・スクリプトからサーバ・コードを実行するには、サーバ・コードにインタフェースを実装する必要があります.
ICallbackEventHandlerインタフェースの宣言
可以将
ICallbackEventHandler
インタフェースは、ページのクラス宣言の一部として宣言されます.コード非表示ページを作成する場合は、次の構文を使用してインタフェースを宣言できます.
Visual Basic Partial Class CallBack_DB_aspx
Inherits System.Web.UI.Page
Implements System.Web.UI.ICallbackEventHandler
C# public partial class CallBack_DB_aspx :
System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
単一ファイル・ページまたはユーザー・コントロールを処理している場合は、ページで使用できます.
@ Implements
次の例に示すように、宣言を追加します.
Visual Basic <%@ Page Language="VB" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
C# <%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
注意:
インタフェース名は大文字と小文字を区別します.
サーバコールバックメソッドの作成
サーバコードでは、インプリメンテーションを作成する必要があります.
RaiseCallbackEvent
方法の方法と1つの実現
GetCallbackResult
方法の方法.
RaiseCallbackEvent
メソッドは、通常イベントハンドラで使用される一般的な2つのパラメータではなく、単一の文字列パラメータを受け入れます.この方法の一部は、次の例と同様である可能性があります.
Visual Basic Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
End Sub
C# public String RaiseCallbackEvent(String eventArgument)
{
}
GetCallbackResult
パラメータを受け入れずに文字列を返します.この方法の一部は、次の例と同様である可能性があります.
Visual Basic Public Function GetCallbackResult() As String Implements _
System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return aStringValue
End Function
C# public string GetCallbackResult()
{
return aStringValue;
}
クライアントスクリプト関数の作成
コールバックと受信結果をサーバ・ページに送信するには、クライアント・スクリプト関数をページに追加する必要があります.両方のクライアントスクリプト関数はECMAScript(JavaScript)で記述されています.
コールバックの送信
コールバックを送信する関数は、サーバコードで生成されます.実際のコールバックは、どのページでも使用可能な、実装されています.
ICallbackEventHandler
インタフェースのライブラリ関数が実行されます.ページを呼び出す
GetCallbackEventReference
メソッドは、ページを使用してライブラリ関数の参照を取得できます.
ClientScript
プロパティにアクセスします.次に、クライアント関数を動的に生成します.この関数には、
GetCallbackEventReference
メソッドの戻り値の呼び出し.このメソッドには、ページへの参照(C#でthis、Visual BasicでMe)、データの転送に使用するパラメータ名、コールバックデータを受信するクライアント・スクリプト関数の名前、および必要なコンテキストのパラメータを転送する方法を伝えます.
関数を生成した後、呼び出し
RegisterClientScriptBlock
メソッドを使用して、ページに挿入します.
次の例では、CallServerという名前のコールバック関数を動的に作成する方法を示します.
Visual Basic 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
C# 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
メソッドの値の名前が一致します.
次の例では、コールバックを呼び出し、その戻り値を処理するために使用できるタグを示します.
Visual Basic <input type="button" value="Callback"
onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>
C# <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
意見をフィードバックする.を送信し、このトピックについてMicrosoftにフィードバックを送信します.
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
<%@ Page Language="VB" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
End Sub
public String RaiseCallbackEvent(String eventArgument)
{
}
Public Function GetCallbackResult() As String Implements _
System.Web.UI.ICallbackEventHandler.GetCallbackResult
Return aStringValue
End Function
public string GetCallbackResult()
{
return aStringValue;
}
コールバックと受信結果をサーバ・ページに送信するには、クライアント・スクリプト関数をページに追加する必要があります.両方のクライアントスクリプト関数はECMAScript(JavaScript)で記述されています.
コールバックの送信
コールバックを送信する関数は、サーバコードで生成されます.実際のコールバックは、どのページでも使用可能な、実装されています.
ICallbackEventHandler
インタフェースのライブラリ関数が実行されます.ページを呼び出す
GetCallbackEventReference
メソッドは、ページを使用してライブラリ関数の参照を取得できます.
ClientScript
プロパティにアクセスします.次に、クライアント関数を動的に生成します.この関数には、
GetCallbackEventReference
メソッドの戻り値の呼び出し.このメソッドには、ページへの参照(C#でthis、Visual BasicでMe)、データの転送に使用するパラメータ名、コールバックデータを受信するクライアント・スクリプト関数の名前、および必要なコンテキストのパラメータを転送する方法を伝えます.
関数を生成した後、呼び出し
RegisterClientScriptBlock
メソッドを使用して、ページに挿入します.
次の例では、CallServerという名前のコールバック関数を動的に作成する方法を示します.
Visual Basic
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
C#
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
メソッドの値の名前が一致します.
次の例では、コールバックを呼び出し、その戻り値を処理するために使用できるタグを示します.
Visual Basic
<input type="button" value="Callback"
onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>
C#
<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>