最終更新日 2005 年 11 月 14 日

このコンテンツのポイント

  • 各ページ間で、データを受け渡す方法として、セッションオブジェクト、クッキー、クエリ文字列を利用する方法を理解する。
  • それぞれの、データ受渡し方法の特性を理解する。

今回紹介するコード

<Default.aspx.cs>

C#
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) //ポストバックではなく初回表示か? 
    {
        Response.Cookies.Add(new HttpCookie ("Data1", "Hello!" )); //クッキー設定
        Session["Data2"] = "こんにちは!" ; //セッション情報設定
    }
    Label1.Text = Response.Cookies["Data1"].Value;
    Label2.Text = (string)Session["Data2"];
}
protected void Button1_Click(object sender, EventArgs e)
{
    Response.Cookies["Data1"].Value = TextBox1.Text;
    Response.Redirect("~/Page2.aspx?state=1");
}
protected void Button2_Click(object sender, EventArgs e)
{
    Session["Data2"] = TextBox1.Text;
    Response.Redirect("~/Page2.aspx?state=2");
}
 

<Page2.aspx.cs>

C#
protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = Request.QueryString["state"];    //クエリ文字列を参照
    Label2.Text = Request.Cookies["Data1"].Value;  //クッキーを参照
    Label3.Text = (string) Session["Data2"];       //セッション情報を参照
}
 

今回のシステム要件

  • Visual Studio 2005 Beta 2

目次

はじめに
作成するアプリケーションの概要
アプリケーションの作成
動作と解説
おわりに

Visual Basic の内容はこちらに掲載しています。
10 行でズバリ!! ページ間におけるデータ受け渡し (VB)

はじめに

Web アプリケーションのフレームワークである ASP.NET では、Web サーバーとクライアントである Web ブラウザとのやり取りで HTTP を使用しています。ブラウザは HTTP 要求をサーバーへ送り、その要求に応じてサーバー サイドでプログラムが実行され、HTTP 応答としてブラウザに HTML が返され、Web ページが表示されます。このような処理は Web ページごとに、1回の HTTP 要求とHTTP応答として完結します。そのため、あるページから別のページに移動した場合に、ページ間で自動的にデータが渡されることはありません。つまり、異なる HTTP要求/応答をまたいで、情報が渡されることはありません。ページ間でデータを受け渡すには、明示的にそれを実装する必要があります。ここでは、このようなページ間のデータの受け渡し方法として、ASP.NET における 「クエリ文字列」や「クッキー」、「セッション」の使用方法について取り上げます。

作成するアプリケーションの概要

ここでは、ASP.NET のWeb フォームとして実装した、二つの Web ページを用意し、一方のページで設定したクエリ文字列やクッキー、セッション情報を、もう一方のページから参照する Web アプリケーションを作成します。

アプリケーションの作成

まず、新規にWebサイトを作成します。Visual Studio 2005 の [ファイル] メニューをクリックし、[新規作成] をポイントして、[Web サイト] をクリックします。 すると、[新しい Web サイト] ダイアログボックスが表示されます。 ここでは、言語として Visual C# を選択し、テンプレートとして 「ASP.NET Web サイト」 を選択します。 [場所] 欄では、ドロップダウン リストで 「ファイル システム」が選択されていることを確認した後、任意のパスを指定して (たとえば、 「C:\Test\WebPassCS」 など)を入力し(図1)、[OK] をクリックします。

図 1. Web サイトを新規に作成する

これで、Web フォームによる Web ページ開発の準備として、雛形となる Web サイトができました。

既定の構成では、Default.aspx の編集画面としてソース ビューが開いているので、編集画面の左下部にある [デザイン] タブをクリックして、Web ページのデザイン画面に切り替えます。このデザイン画面で、画面レイアウトが図2になるように、ツールボックスから、必要なコントロールをドラッグ アンド ドロップします。
Web サーバー コントロールとして、画面の上から順に HyperLink コントロールを二つ、Label コントロールを二つ、TextBox コントロールを一つ、そして、Button コントロールを二つ貼り付けます。また、図2 と同じになるように、テキスト文字列を入力し、各コントロールも表示の通りになるよう Text プロパティを変更します。その他のプロパティは既定のままにします。

図 2. 一つ目のページを作成する

また、画面上の二つの HyperLink コントロールの NavigateUrl プロパティを、それぞれ次の値に設定します。この値は、Web ページ上でリンクとして表示される際の、リンク先のアドレスです。

  • ~/Page2.aspx?state=1
  • ~/Page2.aspx?state=2

アドレスの最後にクエリ文字列として「?state=値」が付いている点に注意してください。ここで指定された値は、リンク先である Page2.aspx に渡すことができます。

画面上に配置された二つの Button コントロールをそれぞれダブルクリックし、二つの Click イベントハンドラを生成させ、Default.aspx.cs 内にある Load イベント ハンドラと、二つの Click イベント ハンドラに、この後に示すコードを記述します。

このコードの Load イベント ハンドラでは、まず Page オブジェクトの (つまり、Web フォーム自身の) IsPostBack プロパティを調べて、ポストバックによる再表示か、それとも初回表示かを確認しています。

初回表示ならば、if ブロックの中で、「Date1」という名前の「Hello!」という値を持つクッキーを、HTTP応答に設定しています。一つのクッキーは、 HttpCookie オブジェクトとして表されます。その次の行では、「Data2」という名前で「こんにちは!」という値を、セッション情報として追加しています。

HTTP 応答の構成には、Response オブジェクトを使い、セッションの構成には Session オブジェクトを使いします。(厳密には、Response や Session[] は、このWebページにあたる Page オブジェクトのプロパティです。) 二つの Click イベント ハンドラでは、テキストボックスに入力した内容を、クッキー、またはセッションに代入しています。その後、Response.Redirect メソッドを使って、Page2.aspx にリダイレクトしています。その際、クエリ文字列として異なる値を渡しています。

 

C#
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) //ポストバックではなく初回表示か?
    {
        Response.Cookies.Add(new HttpCookie("Data1", "Hello!")); /クッキー設定/
        Session["Data2"] = "こんにちは!"; //セッション情報設定
    }
    Label1.Text = Response.Cookies["Data1"].Value;
    Label2.Text = (string)Session["Data2"];
}
protected void Button1_Click(object sender, EventArgs e)
{
    Response.Cookies["Data1"].Value = TextBox1.Text;
    Response.Redirect("~/Page2.aspx?state=1");
}
protected void Button2_Click(object sender, EventArgs e)
{
    Session["Data2"] = TextBox1.Text;
    Response.Redirect("~/Page2.aspx?state=2");
}
 

これで、移動前のページのコードは完成です。

次に、移動後のページを作成するために、ソリューション エクスプローラのツリー上の、Web サイトのノード (今回の例では C:\Test\WebPassCS) を右クリックして、[新しい項目の追加] メニューをクリックします。[新しい項目の追加] ダイアログボックスが表示されるので、テンプレートとして [Web フォーム] を選択し、[名前] ボックスには「Page2.aspx」 と入力します。他は既定のままにして、[追加] ボタンをクリックします。

Page2.aspx のソース ビューが表示されるので、編集画面の左下にある [デザイン] タブをクリックして、デザイン ビューに切り替えます。図3と同じになるように、文字列を入力し、三つの Label コントロールを貼り付けます。Label コントロールの Text プロパティは、空にしてください。

図3. 二つ目のページを作成する

デザイン画面の余白をダブルクリックして、Page2.aspx.cs のコード エディタに切り替え、Page_Load イベント ハンドラに以下のコードを入力します。この Load イベント ハンドラでは、移動前のページで設定されたクエリ文字列、クッキー、およびセッションの値を、各ラベルの Text プロパティに設定しています。結果として、それぞれの値が Label コントロールに表示されます。

C#
protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = Request.QueryString["state"];    //クエリ文字列を参照
    Label2.Text = Request.Cookies["Data1"].Value;  //クッキーを参照
    Label3.Text = (string) Session["Data2"];       //セッション情報を参照
}
 

動作と解説

コードも画面も完成しましたので、実行してみます。まず、ソリューション エクスプローラ上で、Default.aspx を1回クリックして、選択された状態にします。次に、[Ctrl+F5] キーを押すか、[デバッグ] メニューの [デバッグなしで開始] をクリックします。

すると、Visual Studio 2005 の既定の構成では、試験用の Web サーバーとして 「ASP.NET 開発サーバー」が自動的に起動し、そのサーバーの上で、Web アプリケーションが実行されるようになります。また、Web ブラウザが自動的に起動して、選択した Web ページが表示されます。URL には、ASP.NET 開発サーバーが使用するための、ランダムに設定されたポート番号が含まれています。このポート番号はソリューション ファイルに書き込まれ、これ以降は同じポート番号で実行することになります。

図 4. 最初のページが表示される

現在のクッキーの値が「Hello!」、セッションの値は「こんにちは!」になっていることが分ります。ここで、ページの一番上のリンク (~/Page2.aspx?state=1) をクリックして Page2.aspx に移動し、クエリ文字列が「1」になっていることを確認します。また、クッキーやセッションの値も引き渡すことができました。(図5)

図 5. 移動後のページに値が引き継がれる

ブラウザの [戻る] ボタンで、Default.aspx に戻り、二番目のリンクをクリックして、同様に結果を確認します。今度は、クエリ文字列が「2」になっているはずです。

次に、ブラウザの [戻る] ボタンで前のページ Default.aspx に戻り、テキストボックスに「おはよう!!!」と入力します。今度は、[Page2へ移動(state=1)] ボタンを押してみましょう。この場合は、Default.aspx にポストバックされ、Click イベントハンドラ内で、クッキーに「おはよう!!!」が設定されて、Page2.aspx へリダイレクトしています。これは、ブラウザから見た場合、改めて Page2.apsx へ HTTP 要求を送ったことになります。先の例のように、リンクをクリックした場合と同様に、クエリ文字列やクッキー、セッション情報などが移動後のページに渡されていることが分ります。(図6)

ただし、リダイレクトを使う方法では、単にリンクをクリックした場合とは違い、ユーザーが入力した値を検証したり、加工したりした後で、目的のページへ移動できます。この例でも、テキスト ボックスに入力した値を、クッキー経由で渡しています。

図 6. テキストボックスの値をクッキーに設定してから移動する

一旦、ブラウザを閉じて終了し、Visual Studio から再び Default.aspx を起動します。テキストボックスに、「おはよう!!!」と入力して、[Page2へ移動(state=2)] ボタンを押します。今度は、セッション情報に情報が反映されています。

おわりに

Web ページ間でのデータの受渡しは、このようにクラスライブラリを使用した非常に簡単なコードで実装できます。HTTP における実際のクッキーのやり取りや、ASP.NET によるセッション情報管理の詳細を意識する必要はありません。もちろん、使用するにあたって、セキュリティやパフォーマンスなど、様々な要因から検討する必要はあります。たとえば、クッキーを使うということは、サーバーの外部で情報を一時的に保持することになります。また、セッションを使うということは、ユーザーごとの情報を、サーバー上に一時的に保持することになります。これらの点もふまえながら、クエリ文字列やクッキー、セッションの特徴を理解して、有効活用してみてください。


Code Recipe .NET Framework デベロッパー センター

ページのトップへ