ASP.NETには、別ページに遷移し、ページ間でデータを受け渡しする方法がいくつか用意されている。その仕組みと応用例を解説する。
ASP.NETでは、同一ページへのポストバックしかサポートされていない。おかげで、ページからページへデータを受け渡すには、フォーム以外の方法を取らざるをえない。例えば、Sessionプロパティに値を格納してからページを移動する、クエリ文字列に値を指定する(詳しくは後述)などだ。しかし、どちらも大量データの受け渡しには向かず、効率が悪い。より効率的にデータを渡すには、Transferメソッドを使って、擬似的に別ページへとポストバックする手法が有効だ。
■Transferメソッド
いま述べたように、ASP.NETでは同一ページにしかポストバックできない。これは揺るぎない制約だが、いったんポストバックされた後に、サーバ・サイドで別ページへと処理を移すことで、擬似的に別ページへのポストバックが実現できる。この処理に使うメソッドが、HttpServerUtility.Transferメソッドである。例えば、以下のように利用すれば、そこでそのページの処理を打ち切り、別ページであるsampleB.aspxへと処理を移すことができる。
Server.Transfer("sampleB.aspx");
Transferメソッドとよく似たメソッドに、HttpResponse.Redirectメソッドがある。このメソッドも指定したページへと処理を移すという点ではTransferメソッドと同じだが、その実現方法は大きく違う。その違いが、擬似的な別ページへのポストバックを実現する方法の解説にもつながるので、まずRedirectメソッドについて解説しておこう。
Redirectメソッドは、このメソッドが以下のように呼び出されると、クライアントへリスト16.1に示すシンプルなレスポンスが送信される。ここには、ASP.NETページのbodyタグに記述したWebページは含まれていない。
Response.Redirect("sampleB.aspx");
HTTP/1.1 302 Found
Location: /transition/sampleB.aspx
そして、このレスポンスを受け取ったクライアントは、Locationヘッダに指示されたURLへとアクセスする。このアクセスはポストバックではなく、通常のWebページへのアクセスと同じように行われるため、サーバへは何も情報は送信されない。
このように、Redirectメソッドが呼び出されると、ユーザーからはポストバックが1度だけ行われたように見えるが、実際には2度のラウンド・トリップが行われ、その間に最初にポストした情報は失われてしまう。従って、Redirectメソッドを使っても、別ページへのポストバックを実現することはできない。
それでは、Transferメソッドを呼び出したときはどうなるのか。Transferメソッドの場合は、それを呼び出しただけではレスポンスが生成されることはなく、そのままサーバ上で指定されたページへと処理が移行される。つまり、ラウンド・トリップは1度だけなのに、2つのASP.NETページが連続して処理されることになる。このため、最初にポストバックされているsampleA.aspxが実行されていたときに生成されたオブジェクトは、まだメモリ上に残されていて、移行先のsampleB.aspxからアクセスできる。
この仕組みを利用すれば、sampleA.aspxへとポストしていながら、その結果をsampleB.aspxから戻すことができるというわけだ。
Copyright© Digital Advantage Corp. All Rights Reserved.