ASP.NETで別のページにポストバックする - 別のページにポストする - ASP.NET

ASP.NETで別のページにポストバックするコードを紹介します。

概要

ASP.NETではボタンのクリックなどの操作をするとデフォルトでは同じページにPOSTで遷移します。この動作を「ポストバック」と呼んでいます。通常はこの動作でWebアプリケーションを作成できますが、別のページにポストバックしたいことがあります。この記事では別のページにポストバックするコードを紹介します。

方法

別のページにポストバックするにはWebFormコントロールのPostBackUrlプロパティにポストバック先のURLを設定することで実現できます。

プログラム

UI

ASP.NETアプリケーションを作成し、Webフォームを2つ追加します。今回は"default.aspx"と"result.aspx"の名前でWebフォームを追加します。
UIは下記を用意します。

default.aspx

テキストボックスを2つ、ボタンを1つ配置します。


ButtonのPostBackUrlプロパティに"~/result.aspx"を指定します。


default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="PostAnotherPage._default" %>

<!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>
      値1<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
      値2<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />
      <asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="~/result.aspx" /><br />
    </div>
    </form>
</body>
</html>

result.aspx

ラベルを2つ配置します。


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

<!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>
      値1 <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
      値2 <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
    </div>
    </form>
</body>
</html>

コード

以下のコードを記述します。
default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

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

    }
  }
}
result.aspx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace PostAnotherPage
{
  public partial class result : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      System.Collections.Specialized.NameValueCollection postedValues = Request.Form;

      Label1.Text = postedValues["TextBox1"];
      Label2.Text = postedValues["TextBox2"];
    }
  }
}

解説

result.aspx.csは追加のコードはありません。生成されたひな形のコードそのままです。
NameValueCollection型のRequest.Formプロパティを取得しこのページにポストされた値を取得します。NameValueCollection["(キー名)"]でキー名を指定して値を取り出せます。TextBoxのテキストフィールドの値はコントロールのID名になっています。
取得した値はラベルに表示します。

実行結果

プロジェクトを実行します。下図の画面が表示されます。


画面内のテキストボックスに値を入力します。上部のテキストボックス(TextBox1)に"ペンギン"、下部のテキストボックス(TextBox2)に"くじら"を入力しました。入力後[Button]をクリックします。


画面が"result.aspx"に切り替わりテキストボックスに入力した値がラベルに表示されました。


この方法を用いることで別のページに値を渡すことができます。

補足

result.aspx.csのコードを以下に変更するとポストされたすべての値を取得できます。
result.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace PostAnotherPage
{
  public partial class result : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      System.Collections.Specialized.NameValueCollection postedValues = Request.Form;
     
      Label1.Text = "";
      for (int i = 0; i < postedValues.AllKeys.Length; i++ ) {
        Label1.Text += string.Format("{0:s} = {1:s} <br/>",
          postedValues.AllKeys[i], postedValues[i]);
      }
    }
  }
}

解説

ポストされたパラメーター数は、postedValues.AllKeys.Length (Request.Form.AllKeys.Length)で取得できます。
ポストされたi番目のキーはpostedValues.AllKeys[i] (Request.Form.AllKeys[i])で取得できます。
ポストされたi番目のパラメーターはpostedValues[i] (Request.Form[i])で取得できます。

結果

実行すると以下の結果が表示されます。

補足2

遷移元のページは
Page.PreviousPage 
で取得できます。また
Page.PreviousPage.IsValid
で有効性を確認できます。

また、ポストバックによる呼び出しかの判定は
Page.PreviousPage.IsCrossPagePostBack
で判定できます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2020-02-04
作成日: 2013-05-30
iPentec all rights reserverd.