ページ間でサーバー コントロール値を渡す
Web フォーム アプリケーションを作成するときは、多くの場合、Web フォーム ページ間で情報を渡す必要があります。これによって、1 つの Web フォーム ページに入力した情報を別のページに送信し、処理できます。
コード インラインを使用して Web フォーム ページ間で値を渡すためのデザイン パターンは、分離コード ファイルを使用する場合のデザイン パターンとは少し異なります。選択するデザイン パターンは、インライン コードまたは分離コード ファイルのどちらを使用するかによって異なります。両方のデザイン パターンについては、以降のセクションを参照してください。
インライン コードを使用する場合のデザイン パターン
コード インラインを使用して値を別の Web フォーム ページに渡す場合は、まず、送信する情報を含む Web フォーム ページのクラス名を指定する必要があります。ClassName 属性をクラス名と共に @ Page ディレクティブに含めることによって、Web フォーム ページのクラス名を指定します。次に、指定したクラスで、共有する値ごとに get アクセサを伴ったプロパティを作成します。get アクセサは、テキスト ボックスの値など、渡す値を返す必要があります。情報を送信するには、Server オブジェクトの Transfer メソッドを使用して、アプリケーションのコントロールを別の Web フォーム ページに転送します。
送信先の Web フォーム ページでは、Page 属性を送信元のページに設定した @ Reference ディレクティブをページの先頭部分に追加することによって、送信元のページで宣言したクラスを参照します。その後、送信先の Web フォーム ページは、最初に HTTP 要求を受信したハンドラのインスタンスを HttpContext オブジェクトの Handler プロパティから取得することによって、その情報にアクセスできます。次に、ハンドラ オブジェクトが、渡された情報をカプセル化するクラスのインスタンスに変換されます。変換後、変換されたオブジェクトのプロパティを通じて、渡された値にアクセスできます。
注意 クレジット カード情報やパスワードなど、セキュリティの配慮が必要な情報をページ間で受け渡しすることは避けてください。
別の Web フォーム ページに値を送信する Web フォーム ページの作成方法
ClassName 属性を有効なクラス名に設定した @ Page ディレクティブを Web フォーム ページの先頭部分に追加することによって、送信元の Web フォーム ページのクラス名を指定します。
<%@ Page Language="VB" ClassName="MyClassName" %> [C#] <%@ Page Language="C#" ClassName="MyClassName" %>
指定したクラスで、別の Web フォーム ページに渡す値ごとに get アクセサを伴ったプロパティを定義します。get アクセサは、Web フォーム ページのテキスト ボックスの値など、渡す値を返す必要があります。プロパティは、サーバー側スクリプトで定義する必要があります。
<script runat="server"> Public ReadOnly Property FirstName() As String Get ' FirstNameTextBox is the name of a TextBox control. Return FirstNameTextBox.Text End Get End Property </script> [C#] <script runat="server"> public string FirstName { get { // FirstNameTextBox is the name of a TextBox control. return FirstNameTextBox.Text; } } </script>
ボタンがクリックされたときなど、情報を別の Web フォーム ページに渡す場合は、HttpServerUtility.Transfer メソッドを使用して、現在のページでの実行を終了し、アプリケーションのコントロールを別の Web フォーム ページに転送します。HttpServerUtility.Transfer メソッドは、コントロールの転送先となる Web フォーム ページの URL を指定できるようにする、パラメータを 1 つ受け取ります。
Sub SubmitButtonClick(sender As Object, e As EventArgs) Server.Transfer("secondpage.aspx") End Sub [C#] void SubmitButtonClick(object sender, EventArgs e) { Server.Transfer("secondpage.aspx"); }
インライン コードを使用して Web フォーム ページを作成し、2 つの TextBox コントロールの値を別の Web フォーム ページに渡す方法の完全な例を次に示します。このサンプルの名前は、Firstpage.aspx となります。
<%@ Page Language="VB" ClassName="FirstPageClass" %>
<html>
<head>
<script runat="server">
Public ReadOnly Property FirstName() As String
Get
' first is the name of a TextBox control.
Return first.Text
End Get
End Property
Public ReadOnly Property LastName() As String
Get
' last is the name of a TextBox control.
Return last.Text
End Get
End Property
Sub ButtonClicked(sender As Object, e As EventArgs)
Server.Transfer("secondpage.aspx")
End Sub
</script>
</head>
<body>
<form runat="server">
First Name:
<asp:TextBox id="first"
runat="server"/>
<br>
Last Name:
<asp:TextBox id="last"
runat="server"/>
<br>
<asp:Button
OnClick="ButtonClicked"
Text="Go to second page"
runat=server />
</form>
</body>
</html>
[C#]
<%@ Page Language="C#" ClassName="FirstPageClass" %>
<html>
<head>
<script runat="server">
public string FirstName
{
get
{
return first.Text;
}
}
public string LastName
{
get
{
return last.Text;
}
}
void ButtonClicked(object sender, EventArgs e)
{
Server.Transfer("secondpage.aspx");
}
</script>
</head>
<body>
<form runat="server">
First Name:
<asp:TextBox id="first"
runat="server"/>
<br>
Last Name:
<asp:TextBox id="last"
runat="server"/>
<br>
<asp:Button
OnClick="ButtonClicked"
Text="Go to second page"
runat=server />
</form>
</body>
</html>
別の Web フォーム ページから値を受け取る Web フォーム ページの作成方法
情報を受信する Web フォーム ページで、Page 属性を送信元の Web フォーム ページ (渡す情報を含んでいる Web フォーム ページ) に設定した @ Reference ディレクティブをページの先頭部分に追加します。
<%@ Reference Page="firstpage.aspx" %>
サーバー側スクリプトで変数を宣言し、情報を送信する Web フォーム ページで定義されたクラスのインスタンスを格納します。
<script runat="server"> Dim fp As FirstPageClass </script> [C#] <script runat="server"> FirstPageClass fp; </script>
Web フォーム ページが自身にポストバックしない場合は、現在の HTTP 要求用のオブジェクトを実装した IHttpHandler を、前の手順で宣言した変数に代入するカスタム Page_Load イベント ハンドラを作成します。ページが自身にポストバックしているかどうかを判断するには、IsPostBack プロパティを使用します。オブジェクトを実装する IHttpHandler は、最初に HTTP 要求を受信したハンドラのインスタンスを含みます。オブジェクトを実装する IHttpHandler は、前の手順で宣言した変数と同じオブジェクト型ではないため、最初の Web フォーム ページから送信された情報をカプセル化するクラスに変換してからでないと、その変数に代入できません。HttpContext オブジェクトの Handler プロパティを使用して、ハンドラ オブジェクトを取得します。
<script runat="server"> Sub Page_Load() If Not IsPostBack Then fp = CType(Context.Handler, FirstPageClass) End If End Sub </script> [C#] <script runat="server"> void Page_Load() { if (!IsPostBack) { fp = (FirstPageClass)Context.Handler; } } </script>
この時点で、手順 2. で宣言した変数には、前の Web フォーム ページから送信された情報をカプセル化するクラスのインスタンスが含まれています。この変数を使用して、前の Web フォーム ページから送信された情報を含むクラスのプロパティにアクセスします。プログラムによってこれらの値にアクセスし、計算を行ったり、スクリプト デリミタである <%= と %> を使用して単純に表示したりできます。
Hello <%=fp.FirstName%>
別の Web フォーム ページから 2 つの値を受け取る完全な Web フォーム ページを次に示します。受け取り後、2 つの値はこの Web フォーム ページに表示されます。このサンプルの名前は、Secondpage.aspx となります。
<%@ Page Language="VB" %>
<%@ Reference Page="firstpage.aspx" %>
<html>
<head>
<script runat="server">
Dim fp As FirstPageClass
Sub Page_Load()
If Not IsPostBack Then
fp = CType(Context.Handler, FirstPageClass)
End If
End Sub
</script>
</head>
<body>
<form runat="server">
Hello <%=fp.FirstName%> <%=fp.LastName%>
</form>
</body>
</html>
[C#]
<%@ Page Language="C#" %>
<%@ Reference Page="firstpage.aspx" %>
<html>
<head>
<script runat="server">
FirstPageClass fp;
void Page_Load()
{
if (!IsPostBack)
{
fp = (FirstPageClass)Context.Handler;
}
}
</script>
</head>
<body>
<form runat="server">
Hello <%=fp.FirstName%> <%=fp.LastName%>
</form>
</body>
</html>
分離コード ファイルを使用する場合のデザイン パターン
分離コード ファイルを使用する場合、このファイルには、Web フォーム ページに関連付けられたコードのクラス宣言が含まれます。情報を送信する Web フォーム ページの分離コード ファイルでは、まず、宣言したクラスで、共有する値ごとに get アクセサを伴ったプロパティを作成します。get アクセサは、テキスト ボックスの値など、渡す値を返す必要があります。情報を送信するには、Server オブジェクトの Transfer メソッドを使用して、アプリケーションのコントロールを別の Web フォーム ページに転送します。
送信先の Web フォーム ページでは、Page 属性を送信元のページに設定した @ Reference ディレクティブをページの先頭部分に追加することによって、送信元のページで宣言したクラスを参照します。その後、HttpContext オブジェクトの Handler プロパティから、最初に HTTP 要求を受信したハンドラのインスタンスを取得できます。
メモ 送信元の Web フォーム ページで宣言したクラスを送信先の Web フォーム ページの分離コード ファイルで利用できるようにするには、コマンド ライン コンパイラを使用して、手動で各 Web フォーム ページの分離コード ファイルを単一の .dll ファイルにコンパイルする必要があります。この .dll ファイルは、Web フォーム アプリケーションの \Bin ディレクトリに配置する必要があります。
次に、ハンドラ オブジェクトが、渡された情報をカプセル化するクラスのインスタンスに変換されます。変換後、変換されたオブジェクトのプロパティを通じて、渡された値にアクセスできます。
注意 クレジット カード情報やパスワードなど、セキュリティの配慮が必要な情報をページ間で受け渡しすることは避けてください。
別の Web フォーム ページからサーバー コントロール値を送信する方法
送信元の Web フォーム ページに関連付けられたコードのクラス宣言を含む、そのページの分離コード ファイルを作成します。
Imports System ' Add other references here. Public Class FirstPageClass Inherits System.Web.UI.Page ' Add class code here. End Class [C#] Imports System // Add other references here. public class FirstPageClass : System.Web.UI.Page { // Add class code here. }
分離コード ファイルで宣言したクラスで Web フォーム ページのサーバー コントロールにアクセスするには、そのクラスでプロテクト変数を宣言して、アクセスするサーバー コントロールを表します。
Protected FirstNameTextBox As System.Web.UI.WebControls.TextBox [C#] protected System.Web.UI.WebControls.TextBox FirstNameTextBox;
手順 1. で宣言したクラスで、別の Web フォーム ページに渡す値ごとに get アクセサを伴ったプロパティを定義します。get アクセサは、Web フォーム ページのテキスト ボックスの値など、渡す値を返す必要があります。
Public ReadOnly Property FirstName() As String Get ' FirstNameTextBox is the name of a TextBox control. Return FirstNameTextBox.Text End Get End Property [C#] public string FirstName { get { // FirstNameTextBox is the name of a TextBox control. return FirstNameTextBox.Text; } }
ボタンがクリックされたときなど、情報を別の Web フォーム ページに渡す場合は、HttpServerUtility.Transfer メソッドを使用して、現在のページでの実行を終了し、アプリケーションのコントロールを別の Web フォーム ページに転送します。HttpServerUtility.Transfer メソッドは、コントロールの転送先の Web フォーム ページの URL を指定できるように 1 つの引数を受け取ります。
Sub SubmitButtonClick(sender As Object, e As EventArgs) Server.Transfer("secondpage.aspx") End Sub [C#] void SubmitButtonClick(object sender, EventArgs e) { Server.Transfer("secondpage.aspx"); }
情報を送信する Web フォーム ページ用のインターフェイスを作成します。分離コード ファイルで宣言したクラスに設定された Inherits 属性を、必ず @ Page ディレクティブに追加します。
<%@ Page Language="VB" Inherits="FirstPageClass" %> <html> <head> </head> <body> <!-- Add User Interface here --> </body> [C#] <%@ Page Language="C#" Inherits="FirstPageClass" %> <html> <head> </head> <body> <!-- Add User Interface here --> </body>
情報を送信する Web フォーム ページに関連付けられた分離コード ファイルの完全な例を次に示します。このサンプルの名前は、Visual Basic を使用している場合は Firstpage.aspx.vb、C# を使用している場合は Firstpage.aspx.cs です。
Imports System
Public Class FirstPageClass :
Inherits System.Web.UI.Page
Protected first As System.Web.UI.WebControls.TextBox
Protected last As System.Web.UI.WebControls.TextBox
Protected Button1 As System.Web.UI.WebControls.Button
Public ReadOnly Property FirstName() As String
Get
' first is the name of a TextBox control.
Return first.Text
End Get
End Property
Public ReadOnly Property LastName() As String
Get
' last is the name of a TextBox control.
Return last.Text
End Get
End Property
Sub ButtonClicked(sender As Object, e As EventArgs)
Server.Transfer("secondpage.aspx")
End Sub
End Class
[C#]
using System;
public class FirstPageClass : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox first;
protected System.Web.UI.WebControls.TextBox last;
protected System.Web.UI.WebControls.Button Button1;
public string FirstName
{
get
{
return first.Text;
}
}
public string LastName
{
get
{
return last.Text;
}
}
void ButtonClicked(object sender, EventArgs e)
{
Server.Transfer("secondpage.aspx");
}
}
分離コード ファイルを使用して Web フォーム ページを作成し、2 つの TextBox コントロールの値を別の Web フォーム ページに渡す方法の完全な例を次に示します。このサンプルの名前は、Firstpage.aspx となります。
<%@ Page Language="VB" Inherits="FirstPageClass" %>
<html>
<head>
</head>
<body>
<form runat="server">
First Name:
<asp:TextBox id="first"
runat="server"/>
<br>
Last Name:
<asp:TextBox id="last"
runat="server"/>
<br>
<asp:Button
id="Button1"
OnClick="ButtonClicked"
Text="Go to second page"
runat=server />
</form>
</body>
</html>
[C#]
<%@ Page Language="C#" Inherits="FirstPageClass" %>
<html>
<head>
</head>
<body>
<form runat="server">
First Name:
<asp:TextBox id="first"
runat="server"/>
<br>
Last Name:
<asp:TextBox id="last"
runat="server"/>
<br>
<asp:Button
id="Button1"
OnClick="ButtonClicked"
Text="Go to second page"
runat=server />
</form>
</body>
</html>
別の Web フォーム ページからサーバー コントロール値を受信する方法
送信先の Web フォーム ページに関連付けられたコードのクラス宣言を含む、そのページの分離コード ファイルを作成します。
Imports System ' Add other references here. Public Class SecondPageClass Inherits System.Web.UI.Page ' Add class code here. End Class [C#] Imports System // Add other references here. public class SecondPageClass : System.Web.UI.Page { // Add class code here. }
分離コード ファイルで Web フォーム ページのサーバー コントロールにアクセスするには、そのクラスでプロテクト変数を宣言して、アクセスするサーバー コントロールを表します。
Protected FirstNameTextBox As System.Web.UI.WebControls.TextBox [C#] protected System.Web.UI.WebControls.TextBox FirstNameTextBox;
そのクラスで変数を宣言し、情報を送信する Web フォーム ページで定義されたクラスのインスタンスを格納します。変数を送信先の Web フォーム ページで利用できるようにする場合は、それをパブリック変数にします。
メモ 情報を送信する Web フォーム ページで定義されたクラスには、各 Web フォーム ページの分離コード ファイルを単一の .dll ファイルにコンパイルするまでアクセスできません。この .dll ファイルは、Web アプリケーションの \Bin ディレクトリに配置する必要があります。この処理については、以降の手順を参照してください。
Public fp As FirstPageClass [C#] public FirstPageClass fp;
現在の HTTP 要求用のオブジェクトを実装した IHttpHandler を、前の手順で宣言した変数に代入するカスタム Page_Load イベント ハンドラを作成します (Web フォーム ページが自身にポストバックしない場合)。ページが自身にポストバックしているかどうかを判断するには、IsPostBack プロパティを使用します。オブジェクトを実装する IHttpHandler は、最初に HTTP 要求を受信したハンドラのインスタンスを含みます。オブジェクトを実装する IHttpHandler は、前の手順で宣言した変数と同じオブジェクト型ではないため、最初の Web フォーム ページから送信された情報をカプセル化するクラスに変換してからでないと、その変数に代入できません。HttpContext オブジェクトの Handler プロパティを使用して、ハンドラ オブジェクトを取得します。
Sub Page_Load() If Not IsPostBack Then fp = CType(Context.Handler, FirstPageClass) End If End Sub [C#] void Page_Load() { if (!IsPostBack) { fp = (FirstPageClass)Context.Handler; } }
この時点で、手順 3. で宣言した変数には、前の Web フォーム ページから送信された情報をカプセル化するクラスのインスタンスが含まれています。この変数を使用して、前の Web フォーム ページから送信された情報にアクセスします。プログラムによってこれらの値にアクセスし、計算を行ったり、スクリプト デリミタである <%= と %> を使用して単純に表示したりできます。
Hello <%=fp.FirstName%>
情報を送信する Web フォーム ページ用のインターフェイスを作成します。分離コード ファイルで宣言したクラスに設定された Inherits 属性を、必ず @Page ディレクティブに追加します。
<%@ Page Language="VB" Inherits="SecondPageClass" %> <html> <head> </head> <body> <!-- Add User Interface here --> </body> [C#] <%@ Page Language="C#" Inherits="SecondPageClass" %> <html> <head> </head> <body> <!-- Add User Interface here --> </body>
情報を受信する Web フォーム ページで、Page 属性を送信元の Web フォーム ページ (渡す情報を含んでいる Web フォーム ページ) に設定した @ Reference ディレクティブをページの先頭部分に追加します。
<%@ Reference Page="firstpage.aspx" %>
この時点で、送信元と送信先の Web フォーム ページは、両方とも完成しています。ただし、アプリケーションを正常に実行するには、各ページの分離コード ファイルを単一の .dll ファイルにコンパイルする必要があります。この .dll ファイルは、Web アプリケーションの \Bin ディレクトリに配置する必要があります。これによって、送信先の Web フォーム ページでも、送信元の Web フォーム ページで宣言されたクラスにアクセスできるようになります。分離コード ファイルをコンパイルするには、コマンド ラインに次のコマンドを入力します。
vbc /out:Bin\appname.dll /r:System.dll /r:System.Web.dll /t:library firstpage.aspx.vb secondpage.aspx.vb [C#] csc /out:Bin\appname.dll /r:System.dll /r:System.Web.dll /t:library firstpage.aspx.cs secondpage.aspx.cs
情報を受信する Web フォーム ページに関連付けられた分離コード ファイルの完全な例を次に示します。このサンプルの名前は、Visual Basic を使用している場合は Secondpage.aspx.vb、C# を使用している場合は Secondpage.aspx.cs です。
Imports System
Public Class SecondPageClass
Inherits System.Web.UI.Page
Protected DisplayLabel As System.Web.UI.WebControls.Label
Public fp As FirstPageClass
Sub Page_Load()
If Not IsPostBack Then
fp = CType(Context.Handler, FirstPageClass)
End If
End Sub
End Class
[C#]
using System;
public class SecondPageClass : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label DisplayLabel;
public FirstPageClass fp;
void Page_Load()
{
if (!IsPostBack)
{
fp = (FirstPageClass) Context.Handler;
}
}
}
分離コード ファイルを使用して Web フォーム ページを作成し、別の Web フォーム ページから渡された値を受け取る方法の完全な例を次に示します。このサンプルの名前は、Secondpage.aspx となります。
<%@ Page Language="VB" Inherits="SecondPageClass" %>
<%@ Reference Page="firstpage.aspx" %>
<html>
<head>
</head>
<body>
<form runat="server">
Hello <%=fp.FirstName%> <%=fp.LastName%>
</form>
</body>
</html>
[C#]
<%@ Page Language="C#" Inherits="SecondPageClass" %>
<%@ Reference Page="firstpage.aspx" %>
<html>
<head>
</head>
<body>
<form runat="server">
Hello <%=fp.FirstName%> <%=fp.LastName%>
</form>
</body>
</html>
参照
@Page ディレクティブ | HttpServerUtility.Transfer | TextBox | IHttpHandler | Handler