CrossPagePostBack(以下、クロスページポストバック)は、ASP2.0から追加された機能で、
これを用いると1.1までは、同一ページにしかできなかったポストバックが別ページにもできるようになる。
らしいが、いまいち仕組みがわからない。
Microsoft Visual Studio 2005によるWebアプリケーション構築技法を読んでみたが、
「Server.Transferと同様、使わないようにしましょう」
としており、その仕組みは語られてはいない。
1.クロスページポストバックの使い方
ココ見ればすぐわかる。
・[ASP.NET]異なるWebフォームにポスト・データを送信するには?[2.0のみ、C#、VB] - @IT
2.Response.RedirectやServer.Transferとの違い(HTTPレスポンス)
まず、どういったリクエストをしているのか調べてみた。
例として、/WebSite1/Default.aspxから/WebSite1/Default2.aspxへ遷移するものとする
(1)Server.Transfer("Default2.aspx")
POST /WebSite1/Default.aspx HTTP/1.1
レスポンス
HTTP/1.1 200 OK
(2)Response.Redirect("Default2.aspx");
POST /WebSite1/Default.aspx HTTP/1.1
レスポンス
HTTP/1.1 302 Found
Location: /WebSite1/Default2.aspx
(3)クロスページポストバック{PostBackUrlにDefault2.aspxを指定}
POST /WebSite1/Default2.aspx HTTP/1.1
レスポンス
HTTP/1.1 200 OK
上記から分かるように、クロスページポストバックはServer.Transferのように
Default.aspxへのポストバック→イベントハンドラ→Default2.aspxに処理が移る
という動きではなく、直接Default2.aspxにPOSTしている。
だから、Server.TransferではURLが変化しないがクロスページポストバックではちゃんとDefault2.aspxになる
3.2.Response.RedirectやServer.Transferとの違い(コード)
クロスページポストバック(例えばPostBackUrlをボタンコントロールに指定)を使うと、HTMLレンダリングされた結果はこうなっている。
<input type="submit" name="Button1" value="CrossPostBack" onclick="alert('a');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("Button1", "", false, "", "Default2.aspx", false, false))" id="Button1" />
このWebForm_DoPostBackWithOptions(内部はクロスページポストバックではなく、単にオプション付きポストバックなのか)がクロスページポストバックを実現しているみたい。
メソッドの中身をみたいならば、HTMLコード中にはき出されているscriptタグを参照するとよい
例えばこんな感じなのがある。
<script src="/WebSite1/WebResource.axd?d=W7EjdPqwqEL8pB8WF6z9Jg2&t=632769770668593750" type="text/javascript"></script>
WebResource.axdにアクセスすることで、URL変換が行われWebForm_DoPostBackWithOptionsが定義されているJavaScriptにアクセスできる。
4.結局、使えるのかクロスページポストバック
結局どう実現しているか、3から先を見るのがめんどくさくなったので、よくわかっていない。
とりあえずメリットというか、使う場面としては
・既存のソースで、ボタン等のイベントハンドラ内でServer.Transferしている部分は、クロスページポストバックを使用した方が
余計なポストバックが減る分、処理効率がよくなる。またコード量が減る。
だろうか。
しかし新規で作成する場合には、私は使わない。
理由は、
・既にSessionやViewStateを使うコーディングに慣れてしまった
・Server.Transferのように、遷移先(上記例ではDefault2.aspx)の処理がすべて行われないかもしれない
・なんかデータの持ち方として気持ち悪い
・IsPostBackの意味がわからなくなる(※1)
※1
例えば、Default2.aspxのPage_Loadイベントに
if (!IsPostBack) {
//なんか処理
}
としていて、Default.aspxからDefault2.aspxへクロスページポストバックしてきた場合、
ポストバックにもかかわらず、「//なんか処理」になる(IsPostBackがfalse)