QA@IT

C#のページ間ポスティングについて

3898 PV

以下のURLを見てから「ページ間ポスティング」に挑戦してみたのですが上手くいきません。
http://www.atmarkit.co.jp/fdotnet/dotnettips/406asppostback1/asppostback1.html
デバックしてみるとPage.PreviousPageが常にNULLになってしまっているようで、値を渡すことができずに困っています。

ソースは以下の通りです。
・crossPage_before.aspx

<%@ Page Language="C#" %>

<!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>

    </div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" PostBackUrl="crossPage_after_cs.aspx" Text="Button" />
    </form>
</body>
</html>

・crossPage_after_cs.aspx

<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e){
  // ページ間ポスティングでページが呼び出されたかをチェック
  if (Page.PreviousPage != null) {
    if (Page.PreviousPage.IsCrossPagePostBack) {
      // ポスト元ページのテキストボックスの値をラベルに反映
      TextBox PrevText =
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
      Label1.Text = PrevText.Text;
    }
  }
}
</script>
<html>
<head>
<title>ページ間ポストバック</title>
</head>
<body>
<form runat="server">
  こんにちは、<asp:Label id="Label1" runat="server" />さん!
</form>
</body>
</html>

分かる人がいましたらご教授よろしくお願いします。

  • 質問する際は最初にご自分の開発環境を書きませんか? で、問題は参考にされている atmarkit の記事の通りにコードを記述したが、「こんにちは、山田奈美さん!」が表示されないと言ってますか? -
  • 余計なお世話を承知で言わせていただくと、どうしても必要というのでない限り、ASP.NET でクロスページポストバックや Server.Transfer は使わないことをお勧めします。普通にポストバックすればすむケースがほとんどのはずです。 -
  • 「ベストアンサー」をつけていますが解決したのですか? であれば、どのように解決したのか書きましょう。あなたは問題が解決すればそれでいいかもしれませんが、参加者みんなのための「情報の共有」というということも考えてください。 -
  • flied_onionさんの回答の通りプロジェクトの種類を変更することで動作を確認することができたので、解決とさせてもらいました。SurferOnWwwさんもアドバイスいただきありがとうございました。今度からは開発環境も記入して質問させていただきます。 -
  • 返答をありがとうございます。flied_onion さんから返事がないので「ASP.NET WebSite」と「ASP.NET Webアプリケーション」が具体的に何だか分かりませんのですみませんが matsunaga さんにお聞きします。プロジェクトの種類を変更というのは Web サイトプロジェクトを Web アプリケーションプロジェクトに変更したということでしょうか?
    -
  • Web アプリケーションプロジェクトと Web サイトプロジェクトの違いについては次の記事を参照してください。
    https://msdn.microsoft.com/ja-jp/library/dd547590(v=vs.100).aspx
    クロスページポストバックはどちらのプロジェクトでも動きます。参考にされている @IT の記事のコードは Web サイトプロジェクトのもののはずです。
    -
  • いつもお世話になっております。私が変更したのはASP.NET WEBアプリケーションの「Web Forms」テンプレートから「Empty」テンプレートへ変更したら動作を確認することができました。すみませんプロジェクトの変更ではなくテンプレートの変更でした。 -
  • 返答ありがとうございます。・・・が、何故 Web アプリケーションプロジェクトの「Web Forms」テンプレートがダメで「Empty」テンプレートで動いたのか分はかりません。想像するに、アップされたコードは Web サイトプロジェクトのものなので、それをそのまま使うのはそもそも NG なのですが、「Empty」テンプレートでは問題が顕在化せずとりあえず動いたということなのでしょうか。 -
  • Web アプリケーションプロジェクトの形式(.aspx と .aspx.cs に分ける。Visual Studio で作ると自然にそうなるはず)にすれば、テンプレートの違いに関係なく動くと思います。単にテンプレートを変えたという対症療法ではなく、基本的なことを守って作ることをお勧めします。 -
  • Web アプリケーションプロジェクトの形式で作るとコードはどうなるかを回答欄に書いておきます。もちろん、自分の環境で Web アプリケーションプロジェクトの「ASP.NET Web アプリケーション」テンプレート(「空」でない、フォーム認証利用のインターネット用)で作ったアプリで動くことは確認しています。 -

回答

プロジェクトの種類がASP.NET WebSiteになっていませんか?

VS2013で、ASP.NET WebアプリケーションのEmptyテンプレートでは動作しました。

編集 履歴 (0)
  • プロジェクトの種類が ASP.NET WebSite では動かない理由を教えていただけないでしょうか? -
  • 念のため、自分の環境(Vista SP2 32-bit, IIS7, VS2010 Professional, ASP.NET 4)で、[ファイル(F)]⇒[新しい Web サイト(W)...]で「ASP.NET Web サイト」のテンプレートで作った既存の Web サイトプロジェクトに、質問者さんのコードをそのままコピペして試して見ましたが、期待通り動きました。 -
  • それと flied_onion さんが言われる「プロジェクトの種類がASP.NET WebSite」とは違うものですか? 質問者さんのコードも atmarkit のコードも Web サイトプロジェクトのもので、Web アプリケーションプロジェクトではそのままでは動かない(コードビハインド形式にする必要がある)はずですが・・・ -
  • ご指摘の通りプロジェクトの種類を変更することで動作を確認することができました。ありがとうございます。
    -

コメント欄に「Web アプリケーションプロジェクトの形式で作るとコードはどうなるかを回答欄に書いておきます」と書きましたが、そのコードを以下にアップしておきます。

自分の環境(Vista SP2 32-bit, IIS7, VS2010 Professional, ASP.NET 4)で Web アプリケーションプロジェクトの「ASP.NET Web アプリケーション」テンプレート(「空」でない、フォーム認証利用のインターネット用)で作った既存のアプリを利用しました。

それに Visual Studio のソリューションエクスプローラーでプロジェクトを右クリックし、表示されるコンテキストメニューから[追加(D)]⇒[新しい項目(W)...]⇒[Web フォーム]で自動生成される .aspx, .aspx.cs に質問者さんのコードの必要部分をコピペしました。(名前 crossPage_after_cs は crossPage_after に変更しています)

もちろん期待通り動くことは確認済みです。

【要求元】

crossPage_before.aspx.cs(これは自動生成されたコードそのもの)

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

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

        }
    }
}

crossPage_before.aspx

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" 
            PostBackUrl="crossPage_after.aspx" Text="Button" />
    </div>
    </form>
</body>
</html>

【遷移先】

crossPage_after.aspx.cs

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

namespace WebApplication1
{
    public partial class crossPage_after : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // ページ間ポスティングでページが呼び出されたかをチェック
            if (Page.PreviousPage != null)
            {
                if (Page.PreviousPage.IsCrossPagePostBack)
                {
                    // ポスト元ページのテキストボックスの値をラベルに反映
                    TextBox PrevText =
                      (TextBox)Page.PreviousPage.FindControl("TextBox1");
                    Label1.Text = PrevText.Text;
                }
            }
        }
    }
}

crossPage_after.aspx

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        こんにちは、<asp:Label id="Label1" runat="server" />さん!
    </div>
    </form>
</body>
</html>

自動生成される .aspx.designer.cs のコードは割愛します。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。