ページの遷移方法とデータの受け渡し方法
開発環境: Visual Studio 2005
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)
ASP.NETでページ間の方法とデータの受け渡し方法にはいくつかほうほうがあり、それぞれ特徴がありますので注意が必要です。
なお、コメント
#206 のご指摘を受けて、記述を追加してあります。
- RFC 2965 (Obsoletes:
2109)
- cookie について
- Internet
Explorer で Cookie の番号とサイズ制限
- [IE] URL
に使用可能な文字数は最大 2,083 文字
-
IIS Insider
- RFC 2616
Hypertext Transfer Protocol -- HTTP/1.1
ページの遷移方法には次の方法があります。
方法 |
特徴 |
注意事項 |
NavigateUrl (プロパティに値をセットする) |
HyperLink, Menu->MenuItem,
TreeView->TreeNode などのコントロールのNavigateUrlに遷移先URLを設定する方法。 |
|
Response.Redirect |
クライアント側に別のページにリダイレクトするように依頼する。 |
|
Server.Transfer |
サーバ側で転送するため、高速。 |
絶対パスを指定できない。 |
Menu ナビゲーションでは、複数のメニュー項目を持つことができます。[Menu タスク]
から、[メニュー項目の編集]を選択すると、次の [メニュー項目エディタ] から NavigateUrl
を指定することができます。これにより、そのアイテムをクリックしたときに、ページを遷移してくれます。
生成されるコードは次のようになります。
<asp:Menu
ID="Menu1"
runat="server">
<Items>
<asp:MenuItem
NavigateUrl="~/Default.aspx"
Text="新しい項目"
Value="新しい項目"></asp:MenuItem>
</Items>
</asp:Menu>
同様に、TreeViewでは、[TreeView タスク]→[ノードの編集]→を選択すると、[TreeView ノード エディタ]
から NavigateUrl を指定することができます。これにより、そのアイテムをクリックしたときに、ページを遷移してくれます。
生成されるコードは次のようになります。
<asp:TreeView
ID="TreeView1"
runat="server">
<Nodes>
<asp:TreeNode
NavigateUrl="~/Default.aspx"
Text="新しいノード"
Value="新しいノー
ド"></asp:TreeNode>
</Nodes>
</asp:TreeView>
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()); } |
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は、サーバで認識できるファイルパスでなければ転送できないという制限があります。相対パスで指定してください。 |
方法 |
特徴 |
注意事項 |
Application |
異なるセッション間 |
異なるセッション間で値を共有できてしまうため、セキュリティ上の注意が必要。 |
Session |
同一セッション内 |
|
Server.Transferのページ参照を利用 |
Server.Transfer元→Transfer先 |
Transfer元のPublic プロパティにアクセスできます。 |
Cookie |
クライアント側でデータを保持する |
クライアント側でCookieを拒否する設定の場合は使えない。最近は、セキュリティのためにCookieを拒否するケースが多いため、注意が必要。(うちの会社がそうです。) |
GET パラメータ |
.NET以外のページとデータ交換が可能。 |
パラメータがURLのトレーラーとして見えてしまう。エンコーディングに注意。
URLに使用可能な文字数は 2,083 文字 (実際のパスも含めた文字数)。
|
POST パラメータ |
.NET以外のページとデータ交換が可能。 |
POST
を使用する場合、名前と値の組み合わせの発行については URL の文字数の制限はありません。 |
異なるセッションでも共通に扱いたいデータは、Application を使います。
送る側では、次のようにApplication.Add("データ名", データ)で渡します。
渡す側 |
Application.Add("Data3",
"アプリケーションデータ!"); |
受け取り側では、次のようにApplication.Get("名前")で受け取れます。
受け取り側の処理 |
TextBoxApplication.Text = (string)Application.Get("Data3"); |
セッション変数を使用することにより、セッション内で安全にデータを共有することができます。
渡す側 |
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をセットしたつもりになっていますが、別のページにより書き換えられている可能性がありますので、注意が必要です。
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; } |
クッキーでクライアント側にデータを保存することにより、ページ間でデータを受け渡しすることができます。
送る側では、次のように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 のサポートオンラインに、
が掲載されています。 |
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の後ろにパラメータがくっついている。
なお、RFC
2616 Hypertext Transfer Protocol -- HTTP/1.1では、URL
の長さに関する要件は取り決められていません。しかし、IE 6.0 SP1 では、URLに使用可能な文字数は
2,083 文字 (実際のパスも含めた文字数)という制限がありますので注意してください。
同様に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の後ろにパラメータがないですが、ちゃんとデータが渡っている。