C# Programming

Imageページの遷移方法とデータの受け渡し方法

開発環境: Visual Studio 2005 

1.目次

1.目次
2.目的
3.参考書
4.ページの遷移方法
4.1 ページの遷移方法(NavigateUrl)
4.2 ページ の遷移方法(Response.Redirect)
4.3 ページ の遷移方法(Server.Transfer)
5.ページ間でのデータの受け渡し方法
5.1 ページ間でのデータの受け渡し方法(Application)
5.2 ページ間でのデータの受け渡し方法(セッション変数 )
5.3 ページ間でのデータの受け渡し方法 (Server.Transfer)
5.4 ページ間でのデータの受け渡し方法(Cookie)
5.5 ページ間でのデータの受け渡し方法(GET)
5.6 ページ間でのデータの受け渡し方法(POST)

2.目的

ASP.NETでページ間の方法とデータの受け渡し方法にはいくつかほうほうがあり、それぞれ特徴がありますので注意が必要です。

なお、コメント #206 のご指摘を受けて、記述を追加してあります。

3.参考書

  1. RFC 2965 (Obsoletes: 2109)
  2. cookie について
  3. Internet Explorer で Cookie の番号とサイズ制限
  4. [IE] URL に使用可能な文字数は最大 2,083 文字
  5. IIS Insider
  6. RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1

4.ページの遷移方法

ページの遷移方法には次の方法があります。

方法 特徴 注意事項
NavigateUrl
(プロパティに値をセットする)
HyperLink, Menu->MenuItem, TreeView->TreeNode などのコントロールのNavigateUrlに遷移先URLを設定する方法。  
Response.Redirect クライアント側に別のページにリダイレクトするように依頼する。  
Server.Transfer サーバ側で転送するため、高速。 絶対パスを指定できない。

4.1 ページの遷移方法(NavigateUrl)

Menu ナビゲーションでは、複数のメニュー項目を持つことができます。[Menu タスク] から、[メニュー項目の編集]を選択すると、次の [メニュー項目エディタ] から NavigateUrl を指定することができます。これにより、そのアイテムをクリックしたときに、ページを遷移してくれます。

Image

生成されるコードは次のようになります。

<asp:Menu ID="Menu1" runat="server">
    <
Items>
        <
asp:MenuItem NavigateUrl="~/Default.aspx" Text="新しい項目" Value="新しい項目"></asp:MenuItem>
    </
Items>
</
asp:Menu>

同様に、TreeViewでは、[TreeView タスク]→[ノードの編集]→を選択すると、[TreeView ノード エディタ] から NavigateUrl を指定することができます。これにより、そのアイテムをクリックしたときに、ページを遷移してくれます。

Image

生成されるコードは次のようになります。

<asp:TreeView ID="TreeView1" runat="server">
    <
Nodes>
        <
asp:TreeNode NavigateUrl="~/Default.aspx" Text="新しいノード" Value="新しいノー ド"></asp:TreeNode>
    </
Nodes>
</
asp:TreeView>

4.2 ページ の遷移方法(Response.Redirect)

LinkButton, Button などのイベントハンドラで、ボタンがクリックされたときに、次のように呼び出すことにより、ページを遷移できます。

OnClick で渡す
protected void Button1_Click(object sender, EventArgs e)
{
    Response.Redirect(
"http://www.yahoo.co.jp");
}

LinkButton, Button などのイベントハンドラには、ボタンがクリックされたとき以外に、コマンドが実行された場合に、次のように OnCommand イベントハンドラを呼び出すこと ができます。このとき CommandEventArgs の引数にURLを渡してページを遷移することもできます。

OnCommand で渡す
aspx 側

<asp:Button ID="Button1" runat="server" OnCommand="Button1_Command"
Text="Button" CommandArgument="http://uchukamen.com" />

-----
イベントハンドラ側

protected void Button1_Command(object sender, CommandEventArgs e)
{
    Response.Redirect(e.CommandArgument.ToString());
}

4.3 ページ の遷移方法(Server.Transfer)

Server.Transfer(url)で、別のページにリダイレクトします。

そのとき、同様にHTTP POSTのパラメータで渡すことができます。

Server.Transfer
protected void Button1_Click(object sender, EventArgs e)
{
    Server.Transfer(
"http://www.yahoo.co.jp");
}

 

Server.Transferの注意
Server.Transferで、絶対URLを指定すると、『'http://.....' の子要求のパスが無効です。仮想パスが必要です。』というエラーが発生します。Server.Transferは、サーバで認識できるファイルパスでなければ転送できないという制限があります。相対パスで指定してください。

5.ページ間でのデータの受け渡し方法


方法 特徴 注意事項
Application 異なるセッション間 異なるセッション間で値を共有できてしまうため、セキュリティ上の注意が必要。
Session 同一セッション内  
Server.Transferのページ参照を利用 Server.Transfer元→Transfer先 Transfer元のPublic プロパティにアクセスできます。
Cookie クライアント側でデータを保持する クライアント側でCookieを拒否する設定の場合は使えない。最近は、セキュリティのためにCookieを拒否するケースが多いため、注意が必要。(うちの会社がそうです。)
GET パラメータ .NET以外のページとデータ交換が可能。 パラメータがURLのトレーラーとして見えてしまう。エンコーディングに注意。
URLに使用可能な文字数は 2,083 文字 (実際のパスも含めた文字数)。
POST パラメータ .NET以外のページとデータ交換が可能。 POST を使用する場合、名前と値の組み合わせの発行については URL の文字数の制限はありません。

5.1 ページ間でのデータの受け渡し方法(Application)

異なるセッションでも共通に扱いたいデータは、Application を使います。

送る側では、次のようにApplication.Add("データ名", データ)で渡します。

渡す側
Application.Add("Data3", "アプリケーションデータ!");

受け取り側では、次のようにApplication.Get("名前")で受け取れます。

受け取り側の処理
TextBoxApplication.Text = (string)Application.Get("Data3");

5.2 ページ間でのデータの受け渡し方法(セッション変数 )

セッション変数を使用することにより、セッション内で安全にデータを共有することができます。

渡す側
Session["Integer Value"] = 1;

Session["String Value"] = "Hello World";

 

受け取り側
int val = (int)Session["Integer Value"];

string str = (string)Session["String Value"];

 

セッションにデータセットを保存する場合のパターン
private void Page_Load(object sender, System.EventArgs e)
{
   
if (Page.IsPostBack)
    {
        dsCustomers1 = (dsCustomers) Session[
"myDsCustomers"];
    }
   
else
   
{
       
if (Session["myDsCustomers"] == null)
        {
            oleDbDataAdapter1.Fill(dsCustomers1);
            Session[
"myDsCustomers"] = dsCustomers1;
        }
    }
}

 ただし、同一のセッションで複数のページを開き、1つのページでセッション変数Aに値Xをセットし、もう1つのページでセッション変数Aに別の値Yをセットすると、セッション変数Aの値はYになります。最初のページでは、値Xをセットしたつもりになっていますが、別のページにより書き換えられている可能性がありますので、注意が必要です。

5.3 ページ間でのデータの受け渡し方法(Server.Transfer)

Server.Transfer の際に、受け取り側のASPXファイルで、次のように<%@ Reference Page="送り側のファイル名" %>を追加します。これにより、受け取り側で、送り側のクラスのパブリックデータにアクセスできるようになります。

受け取り側
<%@ Page Language="C#" CompileWith="RedirectPost.aspx.cs" ClassName="RedirectPost_aspx" %>
<%
@ Reference Page="Default.aspx" %>

 

渡す側のプロパティ
private string serverTransferValue;

public string ServerTransferValue
{
   
get { return "ServerTransferValue in Default.aspx"; }
}

 

受け取り側の処理
if (Context.Handler is Default_aspx)
{
    Default_aspx sourcePage = (Default_aspx)Context.Handler;
    TextBoxContext.Text = sourcePage.ServerTransferValue;
}

5.4 ページ間でのデータの受け渡し方法(Cookie)

クッキーでクライアント側にデータを保存することにより、ページ間でデータを受け渡しすることができます。

送る側では、次のようにResponse.Cookies.Add(new HttpCookie("名前", "値"); で渡します。

渡す側
Response.Cookies.Add(new HttpCookie("DateTime", DateTime.Now.ToLongTimeString()));

受け取り側では、次のようにRequest.Cookies.Get("名前").Value で受け取れます。

受け取り側の処理
HttpCookie cookie = Request.Cookies.Get("DateTime");
if
(cookie != null)
    TextBoxCookie.Text = cookie.Value;

 

注意
Cookieが存在しない場合に、Request.Cookies.Get()がnullになるので、そのチェックが必要です。

 

注意 Cookieの実装上の制限
RFC 2965 (Obsoletes: 2109) Sec. 5.3 によると、User Agent の実装は
  • 最低でも300個のクッキー
  • 最低でも1つのクッキーあたり4096バイト
  • 最低でも1つのホストまたはドメイン名についき、20個のクッキー

を実装することが推奨されています。仕様的には実装依存なので、無制限に使えるとは思わないほうがいいでしょう。

なお、このあたりの情報に関しては、ちょっと古いですが、Microsoft のサポートオンラインに、

が掲載されています。

5.5 ページ間でのデータの受け渡し方法(GET)

NavigateUrlなど、URLを指定してページを遷移する際に、HTTP GETのパラメータで渡す ことによりデータを受け渡すことができます。

渡す側のHTML
<form method="GET" action="RedirectPost.aspx">
    <p>Name<input type="text" name="name" size="20"></p>
    <p>OS<br>
    <input type="radio" value="C#" name="Lang" checked>C#<br>
    <input type="radio" value="J#" name="Lang">J#<br>
    <input type="radio" value="VB" name="Lang">VB</p>
    <p><input type="submit" value="Submit" name="submit"></p>
</
form>

また、HyperLink などのNavigateUrl に、パラメータを一緒に渡すことができます。この場合、UrlEncode で渡す値をエンコードする必要があります。このときエンコーディングを正しく指定してあげないと、文字化けします。ASP.NETでは、デフォルトでUTF8で処理されます。 このため、Shift-JISでエンコードされたデータが送られてくると文字化けしてしまうので注意が必要です。

渡す側のハイパーリンク
string param1 = HttpUtility.UrlEncode(@"Hello World!", Encoding.UTF8);
string
param2 = HttpUtility.UrlEncode("シーシャープ!", Encoding.UTF8);
string urlStr = "~/RedirectPost.aspx";
urlStr +=
"?" + "Name=" + param1 +"&" + "Lang=" + param2;
HyperLinkRedirectPost.NavigateUrl = urlStr;

受け取り側のページでは、次のようにRequest["パラメータ名"]で受け取れます。

受け取り側の処理
TextBoxPostData1.Text = Request["name"];
TextBoxPostData2.Text = Request[
"lang"];

実行結果

URLの後ろにパラメータがくっついている。

Image

なお、RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1では、URL の長さに関する要件は取り決められていません。しかし、IE 6.0 SP1 では、URLに使用可能な文字数は 2,083 文字 (実際のパスも含めた文字数)という制限がありますので注意してください。

 

5.6 ページ間でのデータの受け渡し方法(POST)

同様にPOSTで渡されるパラメータもGETと同様に受け取ることができます。

NavigateUrlなど、URLを指定してページを遷移する際に、HTTP GETのパラメータで渡す ことによりデータを受け渡すことができます。

渡す側のHTML
<form method="POST" action="RedirectPost.aspx">
    <
p>Name<input type="text" name="name" size="20"></p>
    <
p>OS<br>
    <
input type="radio" value="C#" name="Lang" checked>C#<br>
    <
input type="radio" value="J#" name="Lang">J#<br>
    <
input type="radio" value="VB" name="Lang">VB</p>
    <
p><input type="submit" value="Submit" name="submit"></p>
</
form>

受け取り側のページでは、次のようにRequest["パラメータ名"]で受け取れます。

受け取り側の処理
TextBoxPostData1.Text = Request["name"];
TextBoxPostData2.Text = Request[
"lang"];

実行結果

URLの後ろにパラメータがないですが、ちゃんとデータが渡っている。

Image