|   | 
 
|  
 .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で正しく反映されていれば成功だ。
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間