Partager via


Publication entre pages dans des pages Web ASP.NET

Mise à jour : novembre 2007

Par défaut, les boutons et les autres contrôles qui entraînent une publication (postback) dans une page Web ASP.NET soumettent en retour la page à elle-même. Cela fait partie du cycle d'aller-retour que les pages Web ASP.NET parcourent dans le cadre de leur traitement normal. Pour plus d'informations, consultez Introduction aux pages Web ASP.NET.

Dans certaines circonstances, vous souhaiterez peut-être publier une page dans une autre page. Par exemple, vous pouvez créer un formulaire composé de plusieurs pages, qui rassemble des informations différentes sur chaque page. Vous pouvez dans ce cas configurer dans la page certains contrôles (ceux qui implémentent l'interface IButtonControl, tels que le contrôle Button) pour effectuer la publication dans une page cible différente. Ce procédé est appelé publication sur plusieurs pages. La publication sur plusieurs pages offre certains avantages sur la méthode Transfer pour rediriger vers une autre page. Pour plus d'informations, consultez Redirection des utilisateurs vers une autre page.

Remarque :

Vous pouvez également utiliser le contrôle Wizard pour créer des formulaires à plusieurs vues. Pour plus d'informations, consultez Vue d'ensemble du contrôle serveur Web Wizard.

La publication sur plusieurs pages étant configurée pour des contrôles individuels, vous pouvez créer une page qui publie sur des pages différentes en fonction du bouton sur lequel aura cliqué l'utilisateur.

Obtention d'informations de la page source

Lorsque vous configurez une page pour une publication sur plusieurs pages, vous souhaiterez bien souvent récupérer des informations provenant de la page source. Il peut s'agir d'informations provenant de contrôles de la page (c'est-à-dire des informations publiées par le navigateur), tout autant que de propriétés publiques de la page source.

Obtention de valeurs de contrôles

La classe Page expose une propriété nommée PreviousPage. Si la page source et la page cible se trouvent dans la même application ASP.NET, la propriété PreviousPage de la page cible contient une référence à la page source. (Si la page n'est pas la cible d'une publication sur plusieurs pages, ou si les pages se trouvent dans des applications différentes, la propriété PreviousPage n'est pas initialisée). Par défaut, la propriété PreviousPage est typée en tant que Page.

Remarque :

Si la page source et la page cible se trouvent dans des applications différentes, vous ne pouvez pas obtenir directement les valeurs des contrôles de la page, mais vous pouvez lire les données publiées dans le dictionnaire Form. Vous ne pouvez pas lire l'état d'affichage de la page source car celui-ci est haché. Si vous souhaitez stocker des valeurs dans la page source et les rendre disponibles dans une page cible d'une autre application, vous pouvez les stocker sous forme de chaînes au sein de champs masqués dans la page source et y accéder via Request.Form dans la page cible.

À l'aide de la référence dans la propriété PreviousPage, vous pouvez rechercher des contrôles dans la page source et extraire leur valeur. Cela se fait normalement à l'aide de la méthode FindControl.

Remarque :

Si vous codez spécifiquement la page source pour qu'elle puisse partager des informations avec les pages cibles, une façon plus simple de rendre les valeurs des contrôles disponibles pour la page cible consiste à les exposer en tant que propriétés publiques. Pour plus d'informations, consultez Obtention de valeurs de propriétés publiques à partir de la page source, plus loin dans cette rubrique.

L'exemple de code suivant montre comment obtenir la valeur du contrôle TextBox1 de la page source.

If Not Page.PreviousPage Is Nothing Then
    Dim SourceTextBox As TextBox
    SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
        TextBox)
    If Not SourceTextBox Is Nothing Then
        Label1.Text = SourceTextBox.Text
    End If
End If
if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

La méthode FindControl recherche des contrôles dans le conteneur d'attribution de noms (naming container) actuel. Si le contrôle que vous recherchez se trouve à l'intérieur d'un autre contrôle (en général, à l'intérieur d'un modèle), vous devez commencer par obtenir une référence au conteneur, puis rechercher dans le conteneur le contrôle que vous souhaitez obtenir. Dans l'exemple de code suivant, la page source contient un contrôle Login avec un conteneur LayoutTemplate qui contient lui-même un contrôle nommé TextBoxUserName. Le code obtient la valeur du contrôle UserName.

Dim LoginControl As Login
LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
If Not LoginControl Is Nothing Then
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)
    If Not UserName Is Nothing Then
        Label1.Text = UserName.Text
    End If
Else
    Label1.Text = "Cannot find user name in Login control."
End If
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
    TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
    if (UserName != null)
    {
        Label1.Text = UserName.Text;
    }
}
else
{
    Label1.Text = "Cannot find user name in Login control.";
}

Obtention de valeurs de propriétés publiques à partir de la page source

Dans la page cible d'une publication sur plusieurs pages, vous pouvez également obtenir la valeur des membres publics de la page source. Le scénario le plus courant est que la page source définit des propriétés publiques et que vous souhaitez récupérer leurs valeurs dans la page cible.

Note de sécurité :

Il est conseillé de n'exposer que les informations nécessaires comme propriétés publiques afin de réduire la quantité d'informations ouvertes à des utilisateurs potentiellement malveillants.

Pour obtenir des membres publics depuis la page source, vous devez commencer par récupérer une référence fortement typée à cette page.

Vous pouvez le faire de diverses manières. La première consiste à inclure une directive @ PreviousPageType dans la page cible, ce qui vous permet de spécifier la page source, comme dans cet exemple :

<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> 

Lorsque cette directive est incluse, la propriété PreviousPage est fortement typée comme la classe de la page source référencée. Vous pouvez ainsi référencer directement des membres publics de la page source. Vous pouvez spécifier le type de la page source soit directement, à l'aide d'un attribut type, soit indirectement, en référençant explicitement la page source dans un attribut VirtualPath, comme le montre l'exemple.

L'exemple de code suivant montre une partie d'une page source qui contient une propriété publique nommée CurrentCity, qui expose la valeur d'un contrôle TextBox nommé textCity.

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
Remarque :

Les propriétés de la page source créées essentiellement pour exposer des valeurs à des fins de publication sur plusieurs pages sont habituellement en lecture seule. Bien que la page source puisse contenir des propriétés publiques de lecture/écriture, définir une propriété de page source à partir de la propriété de page cible est généralement sans objet puisque la valeur ne sera pas persistante.

Si la page cible contient une directive PreviousPageType qui pointe vers la page source, vous pouvez accéder à la propriété CurrentCity de la page source à l'aide d'un code comparable au code suivant.

Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;

Une autre façon d'obtenir une référence fortement typée à la page source est d'inclure une directive @ Reference dans la page cible qui référence la page source, comme vous référenceriez tout type que vous souhaitez utiliser sur votre page. Dans ce cas, vous pouvez obtenir la propriété PreviousPage de la page cible dans la page cible et en faire un cast vers le type de page source, comme dans l'exemple de code suivant.

Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

Recherche des publications dans la page cible

Au cours d'une publication entre pages, le contenu des contrôles de la page source est publié dans la page cible et le navigateur exécute une opération de HTTP POST (et non une opération GET). Toutefois, dans la page cible, la propriété IsPostBack est false immédiatement après une publication entre pages. Bien que le comportement soit celui d'un POST, la publication entre pages n'est pas une publication dans la page cible. Par conséquent, IsPostBack a la valeur false et la page cible peut parcourir son nouveau code.

Si cela est utile pour votre application, vous pouvez déterminer si l'exécution de la page cible est le résultat d'une publication entre pages. Pour cela, vous pouvez tester la propriété IsCrossPagePostBack de la référence de page retournée par la propriété PreviousPage de la page cible, comme dans l'exemple de code suivant.

If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If
if(PreviousPage != null)
{
    if(PreviousPage.IsCrossPagePostBack == true)
    {
         Label1.Text = "Cross-page post.";
    }
}
else
{
    Label1.Text = "Not a cross-page post.";
}

Notez que si la page actuelle n'est pas la cible d'une publication entre pages, la propriété PreviousPage retourne null (Nothing en Visual Basic).

Pour plus d'informations, consultez Comment : déterminer la façon dont les pages Web ASP.NET ont été appelées.

Publication sur plusieurs pages et Server.Transfer

La propriété PreviousPage et la directive PreviousPageType sont utiles dans deux situations où vous appelez la page cible : dans une publication entre pages, ce qui est un transfert basé sur le client, et avec la méthode Transfer, ce qui est une opération serveur. Dans les deux opérations, le code de la page cible peut obtenir une référence à la page source à l'aide de la propriété PreviousPage.

Il peut être important dans la page cible de savoir si celle-ci a été appelée à partir d'une publication sur plusieurs pages ou d'une opération Server.Transfer. Pour vous y aider, la classe Page expose une propriété nommée IsCrossPagePostBack. Pour plus d'informations, consultez Comment : déterminer la façon dont les pages Web ASP.NET ont été appelées.

Voir aussi

Tâches

Comment : publier des pages Web ASP.NET dans une autre page

Comment : déterminer la façon dont les pages Web ASP.NET ont été appelées