こういう状況に対応できるのが、次のクラスとインターフェイスです。
まず、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
