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

更新 : 2007 年 11 月

既定では、ASP.NET Web ページでポストバックを発生するボタンおよびその他のコントロールは、それ自身のページにポストバックします。これは、ASP.NET Web ページが通常の処理の一環として通過するラウンドトリップ処理の一部です。詳細については、「ASP.NET Web ページの概要」を参照してください。

場合によっては、1 つのページから別のページにポストすることもあります。たとえば、各ページの情報を収集するマルチページ フォームを作成することもあります。そのような場合は、Button コントロールなどの IButtonControl インターフェイスを実装するページのコントロールが別のターゲット ページにポストするように構成します。これは、ページ間ポスティングと呼びます。ページ間ポスティングは、Transfer メソッドを使用して別のページにリダイレクトする方法よりいくつかの点で優れています。詳細については、「ユーザーをほかのページへリダイレクトする」を参照してください。

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

マルチビュー フォームを作成する場合は、Wizard コントロールも使用できます。詳細については、「Wizard Web サーバー コントロールの概要」を参照してください。

ページ間ポスティングは個々のコントロールに対して構成するため、ユーザーがクリックするボタンによって異なるページにポストするページを作成できます。

ソース ページからの情報の取得

ソース ページから頻繁に情報を取得する必要がある場合は、ページ間ポスティング用にページを構成します。これには、ソース ページのパブリック プロパティからの情報と共にページのコントロールからの情報、つまりブラウザによってポストされる情報が含まれます。

コントロール値の取得

Page クラスは、PreviousPage というプロパティを公開します。ソース ページとターゲット ページが同じ ASP.NET アプリケーションにある場合、ターゲット ページの PreviousPage プロパティにはソース ページへの参照が含まれます。ページ間ポスティングのターゲットではないページまたは別のアプリケーションにあるページの PreviousPage プロパティは初期化されません。既定では、PreviousPage プロパティは Page 型になります。

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

ソース ページとターゲット ページが別のアプリケーションにある場合、一方のページのコントロールの値を直接取得することはできませんが、Form 辞書からポストされたデータを読み取ることはできます。ビューステートはハッシュされているため、ソース ページから読み取ることはできません。ソース ページに値を格納し、別のアプリケーションのターゲット ページで使用できるようにするには、ソース ページの隠しフィールドに値を文字列として格納し、ターゲット ページの Request.Form を使用してアクセスします。

PreviousPage プロパティの参照を使用すると、ソース ページのコントロールを探して値を抽出できます。これは、一般に FindControl メソッドを使用して行います。

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

ターゲット ページと情報を共有できるようにソース ページのコードを記述している場合、ターゲット ページでコントロール値を使用できるようにする簡単な方法は、パブリック プロパティとして公開することです。詳細については、この後の「ソース ページからのパブリック プロパティ値の取得」を参照してください。

ソース ページの TextBox1 コントロールの値を取得する方法のコード例を次に示します。

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 メソッドは、現在の名前付けコンテナでコントロールを探します。目的のコントロールが別のコントロールにある場合 (通常はテンプレート内)、まずコンテナへの参照を取得し、次にコンテナ内で目的のコントロールを探す必要があります。次のコード例では、ソース ページに Login コントロールおよび UserName という TextBox コントロールを含む LayoutTemplate コンテナがあります。このコードは、UserName コントロールの値を取得します。

Dim LoginControl As Login
LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
If Not LoginControl Is Nothing Then
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)
    If Not UserName Is Nothing Then
        Label1.Text = UserName.Text
    End If
Else
    Label1.Text = "Cannot find user name in Login control."
End If
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
    TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
    if (UserName != null)
    {
        Label1.Text = UserName.Text;
    }
}
else
{
    Label1.Text = "Cannot find user name in Login control.";
}

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

ページ間ポスティングのターゲット ページでは、ソース ページのパブリック メンバの値も取得できます。最も一般的な用例は、ソース ページでパブリック プロパティを定義し、ターゲット ページでその値を取得することです。

ms178139.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

悪意のあるユーザーが入手できる情報を少なくなるために、パブリック プロパティにする必要がある情報のみを公開することをお勧めします。

ソース ページのパブリック メンバを取得するには、まずソース ページへの厳密に型指定された参照を取得する必要があります。

それには、いくつかの方法があります。最初の方法は、ターゲット ページに @ PreviousPageType ディレクティブを含めます。これによって、次の例のようにソース ページを指定できます。

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

このディレクティブを追加すると、参照しているソース ページのクラスの型に PreviousPage プロパティが厳密に型指定されます。これで、ソース ページのパブリック メンバを直接参照できます。ソース ページの型は type 属性を使用して直接指定することもでき、または次の例のように、VirtualPath 属性で明示的にソース ページを参照して間接的に指定することもできます。

textCity という TextBox コントロールの値を公開する CurrentCity というパブリック プロパティを含むソース ページの一部のコード例を次に示します。

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
ms178139.alert_note(ja-jp,VS.90).gifメモ :

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

ターゲット ページがソース ページを指す PreviousPageType ディレクティブが含まれる場合、次のようなコードを使用してソース ページの CurrentCity プロパティにアクセスできます。

Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;

ソース ページへの厳密に型指定された参照を取得するもう 1 つの方法は、ページ内で任意の型を参照する場合と同様の方法で、ソース ページを参照するターゲット ページに @ Reference ディレクティブを含めることです。この場合、次のコード例のように、ターゲット ページの PreviousPage プロパティを取得してソース ページの型にキャストできます。

Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

ターゲット ページでポストバックがあるかどうかの確認

ページ間のポストバックでは、ソース ページのコントロールの内容がターゲット ページにポストされ、ブラウザが GET 操作ではなく HTTP POST 操作を実行します。ただし、ターゲット ページでは、ページ間のポストの直後に IsPostBack プロパティが false になります。この操作は POST ですが、ターゲット ページにとってページ間ポスティングはポストバックではありません。したがって、IsPostBack プロパティが false に設定され、ターゲット ページは最初のコードを実行できます。

アプリケーションは、必要に応じてターゲット ページがページ間のポストの結果として実行されているかどうかを確認できます。そのためには、次のコード例のように、ターゲット ページの PreviousPage プロパティが返すページ参照の IsCrossPagePostBack プロパティをテストします。

If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If
if(PreviousPage != null)
{
    if(PreviousPage.IsCrossPagePostBack == true)
    {
         Label1.Text = "Cross-page post.";
    }
}
else
{
    Label1.Text = "Not a cross-page post.";
}

現在のページがページ間ポスティングのターゲットではない場合、PreviousPage プロパティは null を返します (Visual Basic の場合は Nothing)。

詳細については、「方法 : ASP.NET Web ページが呼び出された方法を確認する」を参照してください。

ページ間ポスティングとサーバー転送

PreviousPage プロパティと PreviousPageType ディレクティブは、ターゲット ページを呼び出す 2 つの状況で有効です。この 2 つの状況は、クライアントベースの転送であるページ間のポストバックおよびサーバーベースの操作である Transfer メソッドです。この 2 つの操作では、ターゲット ページのコードは、PreviousPage プロパティを使用してソース ページの参照を取得できます。

ページ間ポスティングまたは Server.Transfer 操作のどちらからページが呼び出されているかを判定することがターゲット ページで重要になる場合があります。そのために、Page クラスは IsCrossPagePostBack というプロパティを公開します。詳細については、「方法 : ASP.NET Web ページが呼び出された方法を確認する」を参照してください。

参照

処理手順

方法 : ASP.NET Web ページを別のページにポストする

方法 : ASP.NET Web ページが呼び出された方法を確認する