次の方法で共有


方法 : ASP.NET Web ページ間で値をやり取りする

更新 : 2007 年 11 月

アプリケーションが複数の ASP.NET Web ページ間でリダイレクト (ナビゲート) する場合、ソース ページからターゲット ページに頻繁に情報を渡します。たとえば、購入する商品をユーザーが選択するページがあるとします。ユーザーがページを送信すると、入力された情報を処理する別のページを呼び出します。

ページ間で情報をやり取りするにはさまざまな方法があり、その一部はリダイレクトの方法に依存します。選択できる方法は次のとおりです。

  • クエリ文字列を使用します。これによって、情報がターゲット ページの URL に追加されます。クエリ文字列は、HyperLink コントロールを使用してナビゲーションをページに連結する場合、またはプログラムで Redirect メソッドを使用して別のページにリダイレクトする場合に使用できます。

    クエリ文字列に値を含めて渡す方法は、ページが同じ Web アプリケーションにない場合にも使用できます。また、情報を ASP.NET Web ページではないページに渡す場合にも使用できます。ターゲット ページが ASP.NET Web ページの場合、HttpRequest オブジェクトの QueryString プロパティからクエリ文字列の値を読み取ることができます。

    6c3yckfw.alert_note(ja-jp,VS.90).gifメモ :

    クエリ文字列を使用して渡す情報はだれでも閲覧でき、容易に変更できるため、セキュリティ上のリスクがあります。したがって、この方法で重要情報を渡すことは避けてください。

  • 使用中のアプリケーションのすべての ASP.NET Web ページがアクセスできるようにする情報は、セッション状態を使用して格納します。ただし、この方法ではサーバーのメモリを使用する上に、セッションの期限が切れるまで情報が保持されるため、単に情報を次のページに渡す場合よりオーバーヘッドが大きくなります。詳細については、「ASP.NET の状態管理の概要」を参照してください。

  • ターゲット ページでは、直接ソース ページからコントロール値とパブリック プロパティの値を読み取ります。この方法は、ソース ページとターゲット ページが相互にポストする場合 (詳しくは「方法 : ASP.NET Web ページを別のページにポストする」を参照)、および Transfer メソッドを呼び出してサーバーのソース ページからターゲット ページに実行を転送する場合の 2 つの状況で有効です。ここでは、ソース ページから直接読み取る方法について説明します。

ソース ページからのパブリック プロパティ値の取得

ターゲット ページとの情報交換のみのためにソース ページを設計し、両方のページが ASP.NET Web ページの場合は、ページ間で情報を共有するパブリック プロパティをソース ページに追加します。次に、ターゲット ページでプロパティの値を読み取ります。

6c3yckfw.alert_note(ja-jp,VS.90).gifメモ :

ソース ページのプロパティは、両方のページが同じ Web アプリケーションにある場合のみターゲット ページで読み取ることができます。

ソース ページからパブリック プロパティ値を取得するには

  1. ソース ページで、パブリック プロパティを 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;
        }
    }
    
    6c3yckfw.alert_note(ja-jp,VS.90).gifメモ :

    ページ間ポスティングの値を公開するためのソース ページのプロパティは一般に読み取り専用です。ソース ページに読み取り/書き込みのパブリック プロパティを含めることはできますが、値が保持されないため、一般にターゲット ページのプロパティからソース ページのプロパティを設定してもあまり用途はありません。

  2. ソース ページを指す @ PreviousPageType ページ ディレクティブをターゲット ページに追加します。

    SourcePage.aspx というソース ページを参照する PreviousPageType ディレクティブのコード例を次に示します。

    <%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> 
    

    PreviousPageType ディレクティブによって、ページの PreviousPage プロパティの型をソース ページのクラスに指定できます。

  3. ターゲット ページのコードで、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;
        }
    }
    
    6c3yckfw.alert_note(ja-jp,VS.90).gifメモ :

    FindControl メソッドは、現在の名前付けコンテナ内のコントロールを探します。目的のコントロールが別のコントロールにある場合 (通常はテンプレート内)、まずコンテナへの参照を取得し、次にコンテナ内で目的のコントロールを探す必要があります。

別のアプリケーションのソース ページからのポスト情報の取得

ソース ページとターゲット ページが同じ Web アプリケーションにない場合は、ソース ページからポストされた値をターゲット ページで読み取ることができます。この方法は、ターゲット ページが ASP.NET Web ページで、ソース ページが ASP.NET Web ページではない場合にも有効です。取得できるのはポストされた値のみで、ページのコントロールの値を自由に読み取ることはできません。

別のアプリケーションのソース ページからコントロールの値を取得するには

  • ターゲット ページで、名前と値のペアの辞書を返す Form コレクションを読み取ります (ポストされたそれぞれの値に対して 1 つのペア)。

    ソース ページでポストされたすべてのコントロールの ID と値を表示し、Label1 というラベルにポストされた値を表示するコード例を次に示します。

    6c3yckfw.alert_note(ja-jp,VS.90).gifメモ :

    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 ページが呼び出された方法を確認する

概念

ASP.NET Web ページにおけるページ間ポスティング

ASP.NET の状態管理の概要