質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

20238閲覧

別ページへPOSTで値を渡して遷移したい

tryCSharp

総合スコア29

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2019/01/22 15:08

編集2019/01/23 01:52

前提・実現したいこと

Page1でButtonを押した時、HiddenFieldの値を設定してPage2へPOSTしたいのですが、Buttton1_Click()内でHiddenFieldに値を設定後、Server.Transfer()をすると値が設定できない上にURLがPage1のままなので都合が悪く(ユーザーにブックマークされたくない)、Response.Redirect()だとGETしか出来ないようなので使用を断念しています。
ButtonのPostBackUrlを使用するとHiddenFieldの値を設定するタイミングが分からず・・・。

実現できなければ設計は変えようと思っていますがダメ元で質問させていただきました。

該当のソースコード

一応Server.Transfer()を使ったものを載せます。

a.aspx

aspx

1<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="a.aspx.cs" Inherits="TransferTest.a" %> 2 3<!DOCTYPE html> 4 5<html xmlns="http://www.w3.org/1999/xhtml"> 6<head runat="server"> 7<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <title></title> 9</head> 10<body> 11 <form id="form1" runat="server"> 12 <div> 13 <asp:HiddenField ID="HiddenField1" runat="server" /> 14 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 15 <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 16 </div> 17 </form> 18</body> 19</html>

a.aspx.cs

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.UI; 6using System.Web.UI.WebControls; 7 8namespace TransferTest 9{ 10 public partial class a : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 15 } 16 17 protected void Button1_Click(object sender, EventArgs e) 18 { 19 HiddenField1.Value = "test"; 20 Server.Transfer("b.aspx"); 21 } 22 } 23}

b.aspx

aspx

1<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="b.aspx.cs" Inherits="TransferTest.b" %> 2 3<!DOCTYPE html> 4 5<html xmlns="http://www.w3.org/1999/xhtml"> 6<head runat="server"> 7<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <title></title> 9</head> 10<body> 11 <form id="form1" runat="server"> 12 <div> 13 <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 14 </div> 15 </form> 16</body> 17</html>

b.aspx.cs

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.UI; 6using System.Web.UI.WebControls; 7 8namespace TransferTest 9{ 10 public partial class b : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 if (!IsPostBack) 15 { 16 Label1.Text = Request.Form["HiddenField1"].ToString(); 17 } 18 } 19 } 20}

補足情報(FW/ツールのバージョンなど)

OS:Windows7
.NET:4.0
IIS:10.0 Express
Visual Studio:2017 Community

SurferOnWww様のご回答を受けてのソース

a.aspx

aspx

1<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="a.aspx.cs" Inherits="TransferTest.a" %> 2 3<!DOCTYPE html> 4 5<html xmlns="http://www.w3.org/1999/xhtml"> 6<head runat="server"> 7<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <title></title> 9</head> 10<body> 11 <form id="form1" runat="server"> 12 <div> 13 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 14 <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 15 </div> 16 </form> 17</body> 18</html>

a.aspx.cs

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.UI; 6using System.Web.UI.WebControls; 7 8namespace TransferTest 9{ 10 public partial class a : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 15 } 16 17 protected void Button1_Click(object sender, EventArgs e) 18 { 19 Session["id"] = TextBox1.Text; 20 // SerferOnWww様のご回答ではここで Session["A.aspx.SpecialKeyName"] にするということでしょうか? 21 Response.Redirect("b.aspx"); 22 } 23 } 24}

b.aspx

aspx

1<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="b.aspx.cs" Inherits="TransferTest.b" %> 2 3<!DOCTYPE html> 4 5<html xmlns="http://www.w3.org/1999/xhtml"> 6<head runat="server"> 7<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <title></title> 9</head> 10<body> 11 <form id="form1" runat="server"> 12 <div> 13 <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 14 </div> 15 </form> 16</body> 17</html>

b.aspx.cs

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.UI; 6using System.Web.UI.WebControls; 7 8namespace TransferTest 9{ 10 public partial class b : System.Web.UI.Page 11 { 12 string strId; 13 14 protected void Page_Load(object sender, EventArgs e) 15 { 16 if (!IsPostBack) 17 { 18 strId = Session["id"].ToString(); // ←ここで別タブのSession["id"]が上書きされてしまうのでは、と考えました。 19 Session["id"].Remove(); 20 Label1.Text = strId; 21 } 22 } 23 } 24}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/22 15:26

前のスレッドで Session のことをいろいろ学んだと思うのですが Session を使わないのは何故ですか?
guest

回答1

0

ベストアンサー

HiddenField を使うというのは何かの勘違いとしか思えません。Session を使いましょう。使えない理由があれば教えてください。

【追記】

下の私の 2019/01/23 10:07 のコメントで「レスが長くなるので上の回答欄に追記します」と書きましたが、それを以下に追記します。

隠蔽するような情報でなければ HiddenField でも良いのかと思っていました。

不可能ではないですが無理筋です(正しくないといっても良いかも)。

ASP.NET Web アプリには、セッション間・ページ間でデータを保持する(状態管理という)手段が多々用意されています。(HiddenField はその中に含まれません)

今回の質問のケースでは Session またはクエリ文字列を使うべきです。

前のスレッドでkunaiさんがご回答してくださったやり方で一旦やってみようと思います。

前のスレッドというのは https://teratail.com/questions/170163 ですよね?

そのスレッドで質問者さんが質問欄に書いた手順 1 ~ 4 の手順 3「Page2で変数にSession["id"]の値を入れる」の「入れる」を「取得する」にするだけで良いと思いますけど、何故そうしないのですか?

Key(名前)の "id" がダブって上書きされるという懸念があるのですか? であれば、一目で区別できるような明確な違いがある Key(名前)にすれば済むと思いますが。Session には Key(名前)と Value(値)のペアは複数設定可能で、Key(名前)の命名は任意ということは知ってますよね?

例えば、Session["A.aspx.SpecialKeyName"] というようにするとか。

前のスレッドで kunai さんが提案されていたような Session["code"]["id"] などということをする必要性は一つもなくて、上記のようにすれば十分と思いますけど、いかがですか?

注:そもそも、単純に Session["code"]["id"] というようなことはできませんが。

【追記2】

下の私の 2019/01/23 10:57 のコメントで「答えを回答欄に追記しておきます」と書きましたが、それを以下に追記します。

Session["id"] = TextBox1.Text; // SerferOnWww様のご回答ではここで Session["A.aspx.SpecialKeyName"] にするということでしょうか?

そのとおりですが、どこか他のページで、誤って同じ "id" という Key(名前)を使って、例えば、

Session["id"] = <別の Object>;

というようなことをして、Key が "id" の Session データが上書きされてしまうというような懸念がなければ、無理にそうする必要はないです。

なお、strId = Session["id"].ToString(); は Session データを取得しているだけで、上書きされることはありません。

ただ、Session は同一 Web アプリ内の複数のページからアクセスできるグローバルなデータ格納領域ですので、誤って削除されたり上書きされたりすることがないように、Key(名前)にはデータを格納したページの名前と何のデータなのかがすぐわかるような名前を付けておくのが望ましいのは確かです。

strId = Session["id"].ToString(); // ←ここで別タブのSession["id"]が上書きされてしまうのでは、と考えました。

上に書いた通り、そのコードは Session データを取得しているだけで、上書きされることはありません。

なお、a.aspx で格納したデータは string 型ですので、取得する際は、

strId = (string)Session["id"];

と、キャストを使うのがお勧めです。

格納したデータが int 型なら int にキャスト、double 型なら double にキャストというように。

投稿2019/01/22 16:03

編集2019/01/23 02:22
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tryCSharp

2019/01/23 00:45

ご回答ありがとうございます。 隠蔽するような情報でなければ HiddenField でも良いのかと思っていました。 Session を使うと Sessionキー をユニークにして受け取り側でどう受け取るのか考えてしまって…。 前のスレッドでkunaiさんがご回答してくださったやり方で一旦やってみようと思います。
退会済みユーザー

退会済みユーザー

2019/01/23 01:07

> 前のスレッドでkunaiさんがご回答してくださったやり方で一旦やってみようと思います。 レスが長くなるので上の回答欄に追記します。
tryCSharp

2019/01/23 01:53

理解力がなく申し訳ございません。 コードを追加してみました。
退会済みユーザー

退会済みユーザー

2019/01/23 01:57

回答欄に追記されたコードのコメントの質問、 // SerferOnWww様のご回答ではここで Session["A.aspx.SpecialKeyName"] にするということでしょうか? // ←ここで別タブのSession["id"]が上書きされてしまうのでは、と考えました。 ・・・に答えれば良いと理解して、答えを回答欄に追記しておきます。
tryCSharp

2019/01/23 03:12

追記の程ありがとうございます。 理解力がなくて本当に申し訳ございません。 つまり、質問欄に追記したコードでしたら下記懸念は必要ないと考えてよいのでしょうか? >ブラウザの別タブや別ウィンドウを使った場合、Session["id"]が上書きされてしまう恐れはないでしょうか。 認識違いでしたら本当に申し訳ございません。 ちなみにもし上記懸念が必要ないとすれば、 Sessionについて2 のスレッドで私の質問内容にはどこが足りなかったのでしょうか?
tryCSharp

2019/01/23 04:12 編集

何度も申し訳ございません。 strId = Session["id"].ToString(); // ←ここで別タブのSession["id"]が上書きされてしまうのでは、と考えました。 と、言うよりは代入する前に Session["id"] が別タブや別ウィンドウで開いたものと書き変わっていないか、という懸念でした。
退会済みユーザー

退会済みユーザー

2019/01/23 03:41

一度、Session に関する私の回答を過去スレッドを含めて全部読んで理解してください。そうしてもらえないと話が通じないような気がします。その上で聞きたいことをまとめて、箇条書きにしてください。 あと、https://teratail.com/help/question-tips も読んでもらって、そこに書いてある「自分が今『何がわからないのか』がわかっていて、言語化できている」ということに配慮いただければと思います。
退会済みユーザー

退会済みユーザー

2019/01/23 04:02

自分も過去スレッドを読み直して気が付いたのですが、前のスレッドの手順 3「Page2で変数にSession["id"]の値を入れる」は、 strId = Session["id"].ToString(); ということだったのでしょうか? 自分は、 Session["id"] = <別の Object>; ということだと思ってました。前者のことだったとすると自分の思い違いだったようですみません。 後者のようなことをしない限り書き換わることはないです。
tryCSharp

2019/01/23 05:26

長々とお付き合いいただきましてありがとうございました。 色々と発言に不備がありまして申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問