.NET TIPS

[ASP.NET]ページ間ポストバックでポスト元ページの情報に簡単にアクセスするには?[2.0のみ、C#、VB]

山田 祥寛
2006/02/10

 「TIPS:[ASP.NET]異なるWebフォームにポスト・データを送信するには?」で紹介したように、ASP.NET 2.0からは「ページ間ポスティング(クロスページ・ポストバック)」を利用することで、異なるページにポストする処理が簡単に行えるようになった。

 もっとも、前掲のTIPSの方法では、ポスト元ページの情報にアクセスするのに、PreviousPageプロパティでポスト元への参照を取得した後、FindControlメソッドで対象のコントロールを検索し、さらにこれを適切な型へキャストしなければならないなど、煩雑な手続きが必要であった。そこで、ポスト先で頻繁に利用するような情報については、その項目をポスト元のページでプロパティとして公開しておくことで、アクセスの手続きを省力化することができる。

 例えば、以下のコードはポスト元のページに配置されたテキストボックスtxtNameの値を、MyNameプロパティとして公開した例だ。

<%@ Page Language="C#" %>
<script runat="Server">
public String MyName {
  get { return txtName.Text; }
}
</script>
<html>
<head>
<title>ページ間ポストバック</title>
</head>
<body>
<form runat="server">
  <asp:TextBox id="txtName" runat="server" />
  <asp:Button id="Button1" runat="server"
    PostBackUrl="cp_after_cs.aspx" Text="送信" />
</form>
</body>
</html>
コントロールの値をロパティとして公開する例(C#版:cp_before_cs.aspx)

<%@ Page Language="VB" %>
<script runat="Server">
Public ReadOnly Property MyName() As String
  Get
    Return txtName.Text
  End Get
End Property
</script>
<html>
<head>
<title>ページ間ポストバック</title>
</head>
<body>
<form runat="server">
  <asp:TextBox id="txtName" runat="server" />
  <asp:Button id="Button1" runat="server"
    PostBackUrl="cp_after_vb.aspx" Text="送信" />
</form>
</body>
</html>
コントロールの値をプロパティとして公開する例(VB版:cp_before_vb.aspx)

 もちろん、プロパティとしてTextBoxコントロールへの参照そのものを公開しても(構文上は)問題ない。しかし、アクセスしたい情報があらかじめ想定できているならば、隠ぺい性という観点からもアクセスの必要がある情報に限定して公開する方がより好ましいだろう。

 それでは、上で公開されたプロパティに対して、ポスト先のページからアクセスしてみよう。

<%@ Page Language="C#" %>
<%@ PreviousPageType VirtualPath="cp_before_cs.aspx" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e) {
  if (Page.PreviousPage != null) {
    if (Page.PreviousPage.IsCrossPagePostBack) {
      Label1.Text = Page.PreviousPage.MyName;
    }
  }
}
</script>
<html>
<head>
<title>ページ間ポストバック</title>
</head>
<body>
<form runat="server">
  こんにちは、<asp:Label id="Label1" runat="server" />さん!
</form>
</body>
</html>
ポスト元ページのプロパティにアクセスするポスト先のページ(C#版:cp_after_cs.aspx)

<%@ Page Language="VB" %>
<%@ PreviousPageType VirtualPath="cp_before_vb.aspx" %>
<script runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
  If Not Page.PreviousPage Is Nothing Then
    If Page.PreviousPage.IsCrossPagePostBack Then
      Label1.Text = Page.PreviousPage.MyName
    End If
  End If
End Sub
</script>
<html>
<head>
<title>ページ間ポストバック</title>
</head>
<body>
<form runat="server">
  こんにちは、<asp:Label id="Label1" runat="server" />さん!
</form>
</body>
</html>
ポスト元ページのプロパティにアクセスするポスト先のページ(VB版:cp_after_vb.aspx)

 ここでポイントとなるのは、@PreviousPageTypeディレクティブだ。

 ポスト元のページがあらかじめ特定できる場合、@PreviousPageTypeディレクティブを使うことで厳密にページを型指定することができる(ポスト元ページを示すPage.PreviousPageプロパティの型がポスト元ページの実際の型となる)。

 VirtualPath属性には、厳密な型を生成する.aspxファイルへのパスを指定すればよい。

<%@ PreviousPageType VirtualPath="cp_before_vb.aspx" %>

 あとは、Page.PreviousPageプロパティを介して取得した厳密に型指定されたPageオブジェクト(実際にはPageクラスの派生クラスのオブジェクト)を取得し、これを介してプロパティにアクセスするだけだ。前掲のTIPSで紹介したFindControlメソッドを利用するのに比べ、シンプルなコードでポスト元のコードにアクセスできることがお分かりいただけるはずだ。

 以上を理解したら、さっそくcp_before_cs.aspx/cp_before_vb.aspxを実行してみよう。



ページ間ポストバックの実行結果
cp_before_cs.aspx/cp_before_vb.aspxで入力した値が、cp_after_cs.aspx/cp_after_vb.aspxに反映される(画面はC#版)。

 実行した結果、cp_before_cs.aspx/cp_before_vb.aspxで入力した値が、cp_after_cs.aspx/cp_after_vb.aspxで正しく反映されていれば成功だ。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:ポストバック
関連TIPS:[ASP.NET]異なるWebフォームにポスト・データを送信するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET]異なるWebフォームにポスト・データを送信するには?
[ASP.NET]ポストとポストバックの違いは?
[ASP.NET]コンテンツ・ページからマスター・ページの情報に簡単にアクセスするには?
[ASP.NET]ページから生成されたソース・コードを見るには?
[ASP.NET]ビューステートに保存されるものは?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間