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

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

ただいまの
回答率

90.45%

  • ASP.NET

    634questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 736

tryCSharp

score 20

前提・実現したいこと

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

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

該当のソースコード

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

a.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="a.aspx.cs" Inherits="TransferTest.a" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:HiddenField ID="HiddenField1" runat="server" />
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
        </div>
    </form>
</body>
</html>

a.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TransferTest
{
    public partial class a : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            HiddenField1.Value = "test";
            Server.Transfer("b.aspx");
        }
    }
}

b.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="b.aspx.cs" Inherits="TransferTest.b" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </div>
    </form>
</body>
</html>

b.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TransferTest
{
    public partial class b : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Label1.Text = Request.Form["HiddenField1"].ToString();
            }
        }
    }
}

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

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

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

a.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="a.aspx.cs" Inherits="TransferTest.a" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
        </div>
    </form>
</body>
</html>

a.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TransferTest
{
    public partial class a : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
                        Session["id"] = TextBox1.Text;
                        // SerferOnWww様のご回答ではここで Session["A.aspx.SpecialKeyName"] にするということでしょうか?
            Response.Redirect("b.aspx");
        }
    }
}

b.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="b.aspx.cs" Inherits="TransferTest.b" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </div>
    </form>
</body>
</html>

b.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TransferTest
{
    public partial class b : System.Web.UI.Page
    {
                string strId;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                                strId = Session["id"].ToString();    // ←ここで別タブのSession["id"]が上書きされてしまうのでは、と考えました。
                                Session["id"].Remove();
                Label1.Text = strId;
            }
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2019/01/23 00:26

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

    キャンセル

回答 1

checkベストアンサー

+1

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/23 09:45

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

    キャンセル

  • 2019/01/23 10:07

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

    レスが長くなるので上の回答欄に追記します。

    キャンセル

  • 2019/01/23 10:53

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

    キャンセル

  • 2019/01/23 10:57

    回答欄に追記されたコードのコメントの質問、

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

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

    ・・・に答えれば良いと理解して、答えを回答欄に追記しておきます。

    キャンセル

  • 2019/01/23 12:12

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

    キャンセル

  • 2019/01/23 12:31 編集

    何度も申し訳ございません。

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

    と、言うよりは代入する前に Session["id"] が別タブや別ウィンドウで開いたものと書き変わっていないか、という懸念でした。

    キャンセル

  • 2019/01/23 12:41

    一度、Session に関する私の回答を過去スレッドを含めて全部読んで理解してください。そうしてもらえないと話が通じないような気がします。その上で聞きたいことをまとめて、箇条書きにしてください。

    あと、https://teratail.com/help/question-tips も読んでもらって、そこに書いてある「自分が今『何がわからないのか』がわかっていて、言語化できている」ということに配慮いただければと思います。

    キャンセル

  • 2019/01/23 13:02

    自分も過去スレッドを読み直して気が付いたのですが、前のスレッドの手順 3「Page2で変数にSession["id"]の値を入れる」は、

    strId = Session["id"].ToString();

    ということだったのでしょうか? 自分は、

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

    ということだと思ってました。前者のことだったとすると自分の思い違いだったようですみません。

    後者のようなことをしない限り書き換わることはないです。

    キャンセル

  • 2019/01/23 14:26

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

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • ASP.NET

    634questions

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