Passage des valeurs du contrôle serveur entre les pages
Lors de la création d'une application Web Forms, il est souvent nécessaire de passer des informations d'une page Web Forms à l'autre. Ceci permet d'entrer des informations sur une page Web Forms puis de les soumettre à une autre page en vue de leur traitement.
Le modèle de design pour le passage des valeurs entre les pages Web Forms utilisant du code inline est légèrement différent de celui pour les fichiers code-behind. Le modèle de design que vous choisissez dépend de ce que vous préférez utiliser : code incorporé ou fichiers code-behind. Les deux modèles de design sont abordés dans les sections suivantes.
Modèle de design utilisant du code incorporé
Lors du passage de valeurs vers une autre page Web Forms à l'aide de code inline, vous devez d'abord spécifier un nom de classe pour la page Web Forms qui contient les informations que vous souhaitez transmettre. Spécifiez un nom de classe pour la page Web Forms en incluant l'attribut ClassName, ainsi que le nom de la classe, dans la directive @Page. Puis créez une propriété avec un accesseur get, dans la classe, pour chaque valeur que vous souhaitez partager. L'accesseur get doit retourner la valeur que vous souhaitez passer, comme la valeur d'une zone de texte. Pour transmettre les informations, transférez le contrôle de l'application à une page Web Forms différente à l'aide de la méthode Transfer de l'objet Server.
Sur la page Web Forms de réception, référencez la classe déclarée dans la page d'envoi en ajoutant une directive @Reference en haut de la page et en affectant la page d'envoi à l'attribut Page. La page Web Forms de réception peut alors accéder aux informations en extrayant d'abord une instance du gestionnaire qui a reçu la demande HTTP en premier de la propriété Handler de l'objet HttpContext. L'objet du gestionnaire est alors converti en une instance de la classe encapsulant l'information passée. Une fois la conversion terminée, les valeurs passées sont accessibles par l'intermédiaire des propriétés de l'objet converti.
ATTENTION Ne passez pas d'informations sensibles (telles que des informations relatives aux cartes de crédit ou des mots de passe) entre les pages.
Pour créer une page Web Forms qui envoie des valeurs à une autre page Web Forms
Spécifiez un nom de classe pour la page Web Forms source en ajoutant une directive @Page en haut de la page, un nom de classe valide étant affecté à l'attribut ClassName.
<%@ Page Language="VB" ClassName="MyClassName" %> [C#] <%@ Page Language="C#" ClassName="MyClassName" %>
Définissez une propriété avec un accesseur get, dans la classe, pour chaque valeur que vous souhaitez passer à une autre page Web Forms. L'accesseur get doit simplement retourner la valeur que vous souhaitez passer, comme la valeur d'une zone de texte sur la page Web Forms. Les propriétés doivent être définies dans le script côté serveur.
<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>
Lorsque vous souhaitez passer les informations à une autre page Web Forms, comme lors d'un clic sur un bouton, utilisez la méthode HttpServerUtility.Transfer pour mettre fin à l'exécution sur la page en cours et transférer le contrôle de l'application vers une autre page Web Forms. La méthode HttpServerUtility.Transfer prend un paramètre unique qui vous permet de spécifier l'URL de la page Web Forms vers laquelle vous souhaitez transférer le contrôle.
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"); }
Suit un exemple complet qui illustre la création d'une page Web Forms, à l'aide de code incorporé, pour passer les valeurs de deux contrôles TextBox à une autre page Web Forms. Cet exemple doit être appelé 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>
Pour créer une page Web Forms qui reçoit des valeurs d'une autre page Web Forms
Sur la page Web Forms qui reçoit les informations, ajoutez une directive @Reference en haut de la page, en affectant la page Web Forms source (page qui contient les informations que vous souhaitez passer) à l'attribut Page.
<%@ Reference Page="firstpage.aspx" %>
Déclarez une variable dans le script côté serveur pour stocker une instance de la classe définie dans la page Web Forms envoyant l'information.
<script runat="server"> Dim fp As FirstPageClass </script> [C#] <script runat="server"> FirstPageClass fp; </script>
Créez un gestionnaire d'événements Page_Load personnalisé qui assigne l'objet implémenté IHttpHandler pour la demande HTTP en cours à la variable déclarée à l'étape précédente lorsque la page Web Forms ne se publie pas sur elle-même. Utilisez la propriété IsPostBack pour déterminer si la page se publie sur elle-même. L'objet implémenté IHttpHandler contient une instance du gestionnaire qui a reçu la demande HTTP en premier. Puisque l'objet implémenté IHttpHandler n'est pas le même type d'objet que la variable déclarée à l'étape précédente, il doit être converti en la classe encapsulant les informations envoyées à partir de la première page Web Forms avant de pouvoir être assigné à la variable. Extrayez l'objet du gestionnaire à l'aide de la propriété Handler de l'objet HttpContext.
<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>
La variable déclarée lors de la deuxième étape contient maintenant une instance de la classe encapsulant les informations provenant de la page Web Forms précédente. Utilisez la variable pour accéder aux propriétés de la classe qui contiennent les informations envoyées à partir de la page Web Forms précédente. Vous pouvez accéder par programme à ces valeurs pour effectuer un calcul ou simplement les afficher à l'aide des délimiteurs de script <%= et %>.
Hello <%=fp.FirstName%>
Suit l'illustration d'une page Web Forms complète qui reçoit deux valeurs d'une autre page Web Forms. Les valeurs sont ensuite affichées sur la page Web Forms. Vous devez appeler cet exemple 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>
Modèle de design utilisant des fichiers code-behind
Lorsque vous utilisez des fichiers code-behind, le fichier code-behind contient une déclaration de classe pour le code associé à la page Web Forms. Dans le fichier code-behind de la page Web Forms envoyant les informations, créez d'abord une propriété avec un accesseur get dans la classe pour chaque valeur que vous souhaitez partager. L'accesseur get doit retourner la valeur que vous souhaitez passer, comme la valeur d'une zone de texte. Pour transmettre les informations, transférez le contrôle de l'application à une page Web Forms différente à l'aide de la méthode Transfer de l'objet Server.
Sur la page Web Forms de réception, référencez la classe déclarée dans la page d'envoi en ajoutant une directive @Reference, en haut de la page, et en affectant la page d'envoi à l'attribut Page. Vous pouvez alors extraire une instance du gestionnaire qui a reçu la demande HTTP en premier de la propriété Handler de l'objet HttpContext.
Remarque Pour rendre la classe déclarée dans la page Web Forms d'envoi disponible dans le fichier code-behind de la page Web Forms de réception, vous devez manuellement compiler les fichiers code-behind de chaque page Web Forms, à l'aide du compilateur de ligne de commande, dans un fichier .dll unique. Le fichier .dll doit être placé dans le répertoire \Bin de l'application Web Forms.
L'objet du gestionnaire est alors converti en une instance de la classe encapsulant l'information passée. Une fois la conversion terminée, les valeurs passées sont accessibles par l'intermédiaire des propriétés de l'objet converti.
ATTENTION Ne passez pas d'informations sensibles (telles que des informations relatives aux cartes de crédit ou des mots de passe) entre les pages.
Pour envoyer des valeurs du contrôle serveur à partir d'une page Web Forms différente
Créez un fichier code-behind pour la page Web Forms d'envoi qui contient une déclaration de classe pour le code associé à la page.
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. }
Pour accéder aux contrôles serveur sur la page Web Forms dans la classe déclarée dans le fichier code-behind, déclarez les variables protégées dans la classe pour représenter les contrôles serveur auquel vous souhaitez accéder.
Protected FirstNameTextBox As System.Web.UI.WebControls.TextBox [C#] protected System.Web.UI.WebControls.TextBox FirstNameTextBox;
Dans la classe déclarée à la première étape, définissez une propriété avec un accesseur get pour chaque valeur que vous souhaitez passer à une autre page Web Forms. L'accesseur get doit simplement retourner la valeur que vous souhaitez passer, comme la valeur d'une zone de texte sur la page Web Forms.
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; } }
Lorsque vous souhaitez passer les informations à une page Web Forms différente, comme lors d'un clic sur un bouton, utilisez la méthode HttpServerUtility.Transfer pour mettre fin à l'exécution sur la page en cours et transférer le contrôle de l'application à une autre page Web Forms. La méthode HttpServerUtility.Transfer prend un argument unique qui vous permet de spécifier l'URL de la page Web Forms vers laquelle vous souhaitez transférer le contrôle.
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"); }
Créez l'interface pour la page Web Forms envoyant les informations. Veillez à ajouter un attribut Inherits à la directive @Page à laquelle la classe déclarée dans le fichier code-behind est affectée.
<%@ 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>
Suit l'illustration d'un exemple complet du fichier code-behind associé à la page Web Forms envoyant les informations. Selon que vous utilisiez Visual Basic ou C#, assurez-vous d'appeler respectivement cet exemple Firstpage.aspx.vb ou 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");
}
}
Suit un exemple complet qui illustre la création d'une page Web Forms avec un fichier code-behind pour passer les valeurs de deux contrôles TextBox à une autre page Web Forms. Veillez à ce que cet exemple s'appelle 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>
Pour recevoir des valeurs du contrôle serveur à partir d'une page Web Forms différente
Créez un fichier code-behind pour la page Web Forms de réception qui contient une déclaration de classe pour le code associé à la page.
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. }
Pour accéder aux contrôles serveur sur la page Web Forms dans le fichier code-behind, déclarez les variables protégées dans la classe pour représenter les contrôles serveur auquel vous souhaitez accéder.
Protected FirstNameTextBox As System.Web.UI.WebControls.TextBox [C#] protected System.Web.UI.WebControls.TextBox FirstNameTextBox;
Déclarez une variable dans la classe pour stocker une instance de la classe définie dans la page Web Forms envoyant l'information. Si vous souhaitez que la variable soit disponible dans la page Web Forms de réception, rendez-la publique.
Remarque La classe définie dans la page Web Forms envoyant l'information n'est pas accessible jusqu'à ce que vous compiliez les fichiers code-behind de chaque page Web Forms en un fichier .dll unique. Le fichier .dll doit être placé dans le répertoire \Bin de l'application Web. Ce processus est décrit dans une étape ultérieure.
Public fp As FirstPageClass [C#] public FirstPageClass fp;
Créez un gestionnaire d'événements Page_Load personnalisé qui assigne l'objet implémenté IHttpHandler pour la demande HTTP en cours à la variable déclarée à l'étape précédente (lorsque la page Web Forms ne se publie pas sur elle-même). Utilisez la propriété IsPostBack pour déterminer si la page se publie sur elle-même. L'objet implémenté IHttpHandler contient une instance du gestionnaire qui a reçu la demande HTTP en premier. Puisque l'objet implémenté IHttpHandler n'est pas le même type d'objet que la variable déclarée à l'étape précédente, il doit être converti en la classe encapsulant les informations envoyées à partir de la première page Web Forms avant de pouvoir être assigné à la variable. Extrayez l'objet du gestionnaire à l'aide de la propriété Handler de l'objet HttpContext.
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; } }
La variable déclarée lors de la troisième étape contient maintenant une instance de la classe encapsulant les informations provenant de la page Web Forms précédente. Utilisez la variable pour accéder aux informations provenant de la page Web Forms précédente. Vous pouvez accéder par programme à ces valeurs pour effectuer un calcul ou simplement les afficher à l'aide des délimiteurs de script <%= et %>.
Hello <%=fp.FirstName%>
Créez l'interface pour la page Web Forms envoyant les informations. Dans la directive @Page, veillez à ajouter un attribut Inherits à laquelle la classe déclarée dans le fichier code-behind est affectée.
<%@ 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>
Ajoutez une directive @Reference en haut de la page Web Forms qui reçoit les informations, en affectant la page Web Forms source (page qui contient les informations que vous souhaitez passer) à l'attribut Page.
<%@ Reference Page="firstpage.aspx" %>
À ce stade, les pages Web Forms d'envoi et de réception sont toutes deux terminées. Cependant, avant que l'application ne puisse fonctionner correctement, les fichiers code-behind de chaque page doivent être compilés ensemble dans un fichier .dll unique. Ce fichier .dll doit être placé dans le répertoire \Bin de l'application Web. Ceci permet à la classe déclarée dans la page Web Forms d'envoi d'être accessible dans la page Web Forms de réception. Pour compiler les fichiers code-behind, entrez la commande suivante sur la ligne de commande :
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
Suit l'illustration d'un exemple complet de fichier code-behind associé à la page Web Forms recevant les informations. Selon que vous utilisiez Visual Basic ou C#, assurez-vous d'appeler respectivement cet exemple Secondpage.aspx.vb ou 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;
}
}
}
Suit un exemple complet qui illustre la création d'une page Web Forms avec un fichier code-behind pour recevoir les valeurs passées à partir d'une page Web Forms différente. Veillez à ce que cet exemple s'appelle 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>
Voir aussi
@ Page, directive | HttpServerUtility.Transfer | TextBox | IHttpHandler | Handler