こういう状況に対応できるのが、次のクラスとインターフェイスです。
まず、JavaScriptのイベントハンドラに対して、ClientScriptManager.GetPostBackEventReferenceで取得した文字列を呼び出すように実装します。このとき、引数として渡した文字列が、次で実装するポストバックイベントハンドラの引数になります。ClientScriptManagerオブジェクトは、Page.ClientScriptから取得できます。
class MyPage : Page { protected void Page_PreRender(object sender, EventArgs e) { var args = "xxx"; // 例えば、詳細情報を表示するためのプライマリキー var js = ClientScript.GetPostBackEventReference(this, args); Table1.Rows[0].Cells[0].Attributes.Add("onclick", js); } }
次に、ポストバックを受けるクラスが、IPostBackEventHandler.RaisePostBackEventを実装します。
// 上のクラスへIPostBackEventHandlerを実装 class MyPage : Page, IPostBackEventHandler { ... public void RaisePostBackEvent(string eventArgs) { // 例えばセッションへeventArgsをセットして詳細ページへ遷移する Session.Add("key", eventArgs); var detail = ResolveUrl("~/MyDetailPage.aspx"); Server.Transfer(detail); } }
以上でJavaScriptからのポストバックが機能します。私が最初に思いついたのは、CSSで非表示にしたボタンをJavaScriptからクリックするという方法でした。しかし、こちらのほうが何倍もスマートだと思います。
ClientScriptManagerには、他にも様々なメソッドがあります。まだまだ便利な機能がありそうです。
参考:
ClientScriptManagerIPostBackEventHandler
0 件のコメント:
コメントを投稿