※以下の内容は多分に推測を含んでいます。
間違いがあることに気づいた場合は修正を行います。
ASP.NET 2.0ではページ間ポスティングという機能が導入され、いままでちょっと面倒だったページを遷移したときのデータの引渡しがだいぶ楽になりました。
ページ間ポスティングの使い方は以下のページによくまとめられています。
[@IT]異なるWebフォームにポスト・データを送信するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/406asppostback1/asppostback1.html
[@IT]ページ間ポストバックでポスト元ページの情報に簡単にアクセスするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/409asppostback2/asppostback2.html
このページ間ポスティングがどうやって実現されているかを調べてみました。調べるきっかけになったのは実は上記の最初の記事です。
当初、ページ間ポスティングの機能は、
がベースになって実現されていると考えていました。
ですが、最初の記事をみるとわかるとおり、遷移後のページでブラウザのアドレス欄にはきちんと遷移後のURLが表示されています。Server.Transferを利用していたのなら、ページが遷移したときもURLの表示はそのままで変わることはありません。これはブラウザ上のアドレス欄はブラウザがアクセスしたURLそのものであり、サーバ上でTransferによって表示するページが変えられたとしてもブラウザがそれを判別してアドレス欄に反映するといったことはできないためです。
では、遷移後にURLがきちんと書き換わるページ間ポスティングでは何が起きているのでしょうか。
仕掛けのひとつはJScriptでした。
ボタンにPostBackUrlを記述している場合、このボタンのクリック時に、ボタンが含まれているFormタグのsubmit先がスクリプトによってPostBackUrlに置き換えられます。つまり、クライアント側でスクリプトが動くことによって動的にsubmit先を変更しているわけです。
ブラウザは置き換えられたURLにアクセスしにいきますから、アドレス欄にはきちんと遷移後のURLが表示されます。
アドレスの謎は解けました。ここで新たな謎となってくるのが、PreviousPageの存在です。
Transferを使っている場合、PreviousPageが存在していることは理解できます。Transferを利用しているときは、遷移前のページのインスタンスでTransferメソッドが呼ばれ、遷移後のページのインスタンスが生成されます。この時点でサーバ上には遷移前のページのインスタンスと遷移後のページのインスタンスの両方が存在していることになります。
2つのページのインスタンスが同時にサーバ上に存在していますから、遷移後のページのインスタンスを生成するときにそのPreviousPageとして遷移前のページのインスタンスを設定しているのだろうという推測が成り立ちます。
しかし、ページ間ポスティングの場合、最初からブラウザが遷移後のURLにアクセスしにいくのですから、サーバ側には遷移後のページのインスタンスしか生成されないはずです。PreviousPageはどうやって生成されるのでしょうか。。。
もう一度遷移前のページのHTMLをじっくり眺めてみます。
そこで気になるが"__PREVIOUSPAGE"という名前がついたInputタグです。
ここからはまったくのあてずっぽうになりますが、ASP.NETは"__PREVIOUSPAGE"という名前のデータを受け取った場合、たぶんそのデータ中に含まれるであろうクラス名から遷移前のページのインスタンスを生成し、PreviousPageとして設定するのではないでしょうか。
通常、ASP.NETはPOST形式でデータを受け取る(POSTBACK)と、そのURLからどのページのインスタンスを生成するかを選択し、POSTされたデータをそのインスタンスに埋め込んでいく、という作業を行っています。
"__PREVIOUSPAGE"というデータがある場合は、まずURLからページのインスタンスを生成する。その後"__PREVIOUSPAGE"のデータに含まれるページを選択して別のインスタンスを生成し、POSTされたデータは後から生成したインスタンスに埋め込んで、URLで指定されたページのPreviousPageとして設定する。たぶんこのような処理が行われているのではないでしょうか。
自分としてはこれで一応の説明はつく、と考えています。
◆ この記事についてのご意見、ご質問は以下のフォーラムにお願いします ◆
http://dotnetfan.org/forums/598/ShowPost.aspx