方法 : ASP.NET Web ページ間で値をやり取りする
更新 : 2007 年 11 月
アプリケーションが複数の ASP.NET Web ページ間でリダイレクト (ナビゲート) する場合、ソース ページからターゲット ページに頻繁に情報を渡します。たとえば、購入する商品をユーザーが選択するページがあるとします。ユーザーがページを送信すると、入力された情報を処理する別のページを呼び出します。
ページ間で情報をやり取りするにはさまざまな方法があり、その一部はリダイレクトの方法に依存します。選択できる方法は次のとおりです。
クエリ文字列を使用します。これによって、情報がターゲット ページの URL に追加されます。クエリ文字列は、HyperLink コントロールを使用してナビゲーションをページに連結する場合、またはプログラムで Redirect メソッドを使用して別のページにリダイレクトする場合に使用できます。
クエリ文字列に値を含めて渡す方法は、ページが同じ Web アプリケーションにない場合にも使用できます。また、情報を ASP.NET Web ページではないページに渡す場合にも使用できます。ターゲット ページが ASP.NET Web ページの場合、HttpRequest オブジェクトの QueryString プロパティからクエリ文字列の値を読み取ることができます。
メモ : クエリ文字列を使用して渡す情報はだれでも閲覧でき、容易に変更できるため、セキュリティ上のリスクがあります。したがって、この方法で重要情報を渡すことは避けてください。
使用中のアプリケーションのすべての ASP.NET Web ページがアクセスできるようにする情報は、セッション状態を使用して格納します。ただし、この方法ではサーバーのメモリを使用する上に、セッションの期限が切れるまで情報が保持されるため、単に情報を次のページに渡す場合よりオーバーヘッドが大きくなります。詳細については、「ASP.NET の状態管理の概要」を参照してください。
ターゲット ページでは、直接ソース ページからコントロール値とパブリック プロパティの値を読み取ります。この方法は、ソース ページとターゲット ページが相互にポストする場合 (詳しくは「方法 : ASP.NET Web ページを別のページにポストする」を参照)、および Transfer メソッドを呼び出してサーバーのソース ページからターゲット ページに実行を転送する場合の 2 つの状況で有効です。ここでは、ソース ページから直接読み取る方法について説明します。
ソース ページからのパブリック プロパティ値の取得
ターゲット ページとの情報交換のみのためにソース ページを設計し、両方のページが ASP.NET Web ページの場合は、ページ間で情報を共有するパブリック プロパティをソース ページに追加します。次に、ターゲット ページでプロパティの値を読み取ります。
メモ : |
---|
ソース ページのプロパティは、両方のページが同じ Web アプリケーションにある場合のみターゲット ページで読み取ることができます。 |
ソース ページからパブリック プロパティ値を取得するには
ソース ページで、パブリック プロパティを 1 つまたは複数作成します。
textCity という TextBox コントロールの値を公開する CurrentCity というプロパティのコード例を次に示します。
Public ReadOnly Property CurrentCity() As String Get Return textCity.Text End Get End Property
public String CurrentCity { get { return textCity.Text; } }
メモ : ページ間ポスティングの値を公開するためのソース ページのプロパティは一般に読み取り専用です。ソース ページに読み取り/書き込みのパブリック プロパティを含めることはできますが、値が保持されないため、一般にターゲット ページのプロパティからソース ページのプロパティを設定してもあまり用途はありません。
ソース ページを指す @ PreviousPageType ページ ディレクティブをターゲット ページに追加します。
SourcePage.aspx というソース ページを参照する PreviousPageType ディレクティブのコード例を次に示します。
<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>
PreviousPageType ディレクティブによって、ページの PreviousPage プロパティの型をソース ページのクラスに指定できます。
ターゲット ページのコードで、PreviousPage プロパティの厳密に型指定されたメンバを使用して、ソース コードのプロパティを読み取ります。
ソース ページで定義されている CurrentCity プロパティの値を読み取るコード例を次に示します。
Label1.Text = PreviousPage.CurrentCity
Label1.Text = PreviousPage.CurrentCity;
同じアプリケーションのソース ページからのコントロール情報の取得
ソース ページとターゲット ページが共に ASP.NET Web ページで、同じ Web アプリケーションにある場合、ソース ページのコントロールの値をターゲット ページで読み取ることができます。必要とする情報を含むパブリック プロパティをソース ページが公開しない場合は、この方法を使用する場合があります。
同じアプリケーションのソース ページからコントロールの値を取得するには
ターゲット ページの PreviousPage プロパティを使用してソース ページの参照を取得し、FindControl メソッドを呼び出して目的のコントロールの参照を取得します。
ソース ページの TextBox1 コントロールの値を取得し、Label1 というコントロールに表示するコード例を次に示します。
If Not Page.PreviousPage Is Nothing Then Dim SourceTextBox As TextBox SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _ TextBox) If Not SourceTextBox Is Nothing Then Label1.Text = SourceTextBox.Text End If End If
if (Page.PreviousPage != null) { TextBox SourceTextBox = (TextBox)Page.PreviousPage.FindControl("TextBox1"); if (SourceTextBox != null) { Label1.Text = SourceTextBox.Text; } }
メモ : FindControl メソッドは、現在の名前付けコンテナ内のコントロールを探します。目的のコントロールが別のコントロールにある場合 (通常はテンプレート内)、まずコンテナへの参照を取得し、次にコンテナ内で目的のコントロールを探す必要があります。
別のアプリケーションのソース ページからのポスト情報の取得
ソース ページとターゲット ページが同じ Web アプリケーションにない場合は、ソース ページからポストされた値をターゲット ページで読み取ることができます。この方法は、ターゲット ページが ASP.NET Web ページで、ソース ページが ASP.NET Web ページではない場合にも有効です。取得できるのはポストされた値のみで、ページのコントロールの値を自由に読み取ることはできません。
別のアプリケーションのソース ページからコントロールの値を取得するには
ターゲット ページで、名前と値のペアの辞書を返す Form コレクションを読み取ります (ポストされたそれぞれの値に対して 1 つのペア)。
ソース ページでポストされたすべてのコントロールの ID と値を表示し、Label1 というラベルにポストされた値を表示するコード例を次に示します。
メモ : ASP.NET Web ページからポストされた情報には、ページの内部処理に使用される __VIEWSTATE、__EVENTTARGET、__EVENTARGUMENT などの隠しフィールドの値が含まれます。ポストされたフィールドの中で、先頭に 2 つのアンダースコア (__) が付いているフィールドの値を除外するコード例を次に示します。
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load Dim displayValues As New StringBuilder() Dim postedValues As NameValueCollection = Request.Form Dim nextKey As String For i As Integer = 0 To postedValues.AllKeys.Length - 1 nextKey = postedValues.AllKeys(i) If nextKey.Substring(0, 2) <> "__" Then displayValues.Append("<br>") displayValues.Append(nextKey) displayValues.Append(" = ") displayValues.Append(postedValues(i)) End If Next Label1.Text = displayValues.ToString() End Sub
void Page_Load(object sender, EventArgs e) { System.Text.StringBuilder displayValues = new System.Text.StringBuilder(); System.Collections.Specialized.NameValueCollection postedValues = Request.Form; String nextKey; for(int i = 0; i < postedValues.AllKeys.Length - 1; i++) { nextKey = postedValues.AllKeys[i]; if(nextKey.Substring(0, 2) != "__") { displayValues.Append("<br>"); displayValues.Append(nextKey); displayValues.Append(" = "); displayValues.Append(postedValues[i]); } } Label1.Text = displayValues.ToString(); }
参照
処理手順
方法 : ASP.NET Web ページが呼び出された方法を確認する