Comment : passer des valeurs entre des pages Web ASP.NET

Mise à jour : novembre 2007

Si votre application est redirigée (par navigation) depuis une page Web ASP.NET vers une autre, vous souhaiterez souvent passer des informations de la page source à la page cible. Par exemple, vous pouvez avoir une page sur laquelle les utilisateurs peuvent sélectionner des articles à acheter. Lorsque les utilisateurs soumettent cette page, vous souhaitez appeler une autre page capable de traiter les informations que l'utilisateur vient de saisir.

Vous pouvez passer des informations entre des pages de plusieurs façons, certaines de ces techniques dépendant de la procédure de redirection. Vous pouvez choisir entre les options suivantes :

  • Utiliser une chaîne de requête, qui ajoute des informations à l'URL de la page cible. Vous pouvez utiliser une chaîne de requête lors de l'utilisation d'un contrôle HyperLink pour générer la navigation dans une page, ou lorsque vous redirigez par programme vers une autre page à l'aide de la méthode Redirect.

    Passer des valeurs dans une chaîne de requête fonctionne même si les pages ne se trouvent pas dans la même application Web. Cela fonctionne également si vous souhaitez passer des informations à une page qui ne soit pas une page Web ASP.NET. Si la page cible est une page Web ASP.NET, vous pouvez lire la valeur de la chaîne de requête dans la propriété QueryString de l'objet HttpRequest.

    Remarque :

    Ne passez jamais de données sensibles dans une chaîne de requête : les informations sont visibles par les utilisateurs et peuvent être facilement modifiées. Cela peut donc représenter un problème de sécurité potentiel.

  • Utilisez l'état de session pour stocker des informations afin de les rendre accessibles à toutes les pages Web ASP.NET dans l'application actuelle. Toutefois, cette procédure utilise de la mémoire serveur et les informations sont stockées jusqu'à expiration de la session. La charge en mémoire que cela implique peut vous sembler trop importante pour un simple passage d'informations d'une page à une autre. Pour plus d'informations, consultez Vue d'ensemble de la gestion d'état ASP.NET.

  • Dans la page cible, lisez directement les valeurs des contrôles et des propriétés publiques dans la page source. Cette stratégie fonctionne dans deux situations : lorsque la page source publie sur la page cible (pour plus d'informations, consultez Comment : publier des pages Web ASP.NET dans une autre page) et lorsque vous appelez la méthode Transfer pour transférer l'exécution de la page source à la page cible sur le serveur. La stratégie consistant à lire directement les valeurs dans la page source est décrite dans cette rubrique.

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

Si vous concevez spécifiquement la page source pour qu'elle partage des informations avec les pages cibles et si toutes sont des pages Web ASP.NET, vous pouvez ajouter à la page source des propriétés publiques qui exposent les informations que vous souhaitez faire partager à vos pages. Vous pouvez ensuite lire les valeurs des propriétés dans les pages cibles.

Remarque :

Vous ne pouvez lire les propriétés de la page source dans la page cible que si les deux pages se trouvent dans la même application Web.

Pour obtenir des valeurs de propriétés publiques à partir de la page source

  1. Dans la page source, créez une ou plusieurs propriétés publiques.

    L'exemple de code suivant montre une propriété 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 entre 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.

  2. Dans la page cible, ajoutez une directive de page @ PreviousPageType qui pointe vers la page source.

    L'exemple de code suivant montre une directive PreviousPageType qui référence une page source nommée SourcePage.aspx.

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

    La directive PreviousPageType a pour conséquence d'affecter à la propriété PreviousPage de la page le type de la classe de la page source.

  3. Dans le code de la page cible, utilisez des membres fortement typés de la propriété PreviousPage pour lire les propriétés du code source.

    L'exemple de code suivant lit la valeur de la propriété CurrentCity définie dans la page source.

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

Obtention d'informations de contrôle à partir de la page source dans la même application

Si les pages source et cible sont toutes deux des pages Web ASP.NET et si elles se trouvent dans la même application Web, vous pouvez lire la valeur des contrôles dans la page source tout en vous trouvant dans la page cible. Vous pouvez utiliser cette stratégie si la page source n'expose pas les propriétés publiques qui contiennent les informations dont vous avez besoin.

Pour obtenir la valeur des contrôles depuis la page source dans la même application

  • Dans la page cible, obtenez une référence à la page source à l'aide de la propriété PreviousPage de la page cible, puis appelez la méthode FindControl pour obtenir une référence au contrôle qui vous intéresse.

    L'exemple de code suivant récupère la valeur du contrôle TextBox1 de la page source et l'affiche dans le contrôle nommé Label1 :

    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;
        }
    }
    
    Remarque :

    La méthode FindControl recherche des contrôles dans le conteneur de dénomination (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.

Obtention d'informations de publication à partir de la page source située dans une autre application

Si les pages source et cible ne se trouvent pas dans la même application Web, vous pouvez lire les valeurs publiées de la page source dans la page cible. Cette technique fonctionne également si la page cible est une page Web ASP.NET, mais que la page source ne l'est pas. Notez que vous ne pouvez obtenir que les valeurs de publication ; vous ne pouvez pas lire la valeur de contrôles arbitraires dans la page.

Pour obtenir la valeur des contrôles de la page source dans une autre application

  • Dans la page cible, lisez la collection Form, laquelle retourne un dictionnaire de paires nom/valeur, une paire pour chaque valeur publiée.

    L'exemple de code suivant montre l'ID et la valeur de chaque contrôle publié dans la page source et affiche les valeurs publiées dans une étiquette nommée Label1.

    Remarque :

    Les informations de publication d'une page Web ASP.NET comprennent la valeur des champs masqués, tels que __VIEWSTATE, __EVENTTARGET et __EVENTARGUMENT, lesquels servent au traitement interne dans la page. L'exemple de code suivant exclut les valeurs des champs publiés dont le nom est précédé d'un double trait de soulignement (__).

    Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles Me.Load
        Dim displayValues As New StringBuilder()
        Dim postedValues As NameValueCollection = Request.Form
        Dim nextKey As String
        For i As Integer = 0 To postedValues.AllKeys.Length - 1
            nextKey = postedValues.AllKeys(i)
            If nextKey.Substring(0, 2) <> "__" Then
                displayValues.Append("<br>")
                displayValues.Append(nextKey)
                displayValues.Append(" = ")
                displayValues.Append(postedValues(i))
            End If
        Next
        Label1.Text = displayValues.ToString()
    End Sub
    
    void Page_Load(object sender, EventArgs e)
    {
        System.Text.StringBuilder displayValues = 
            new System.Text.StringBuilder();
        System.Collections.Specialized.NameValueCollection 
            postedValues = Request.Form;
        String nextKey;
        for(int i = 0; i < postedValues.AllKeys.Length - 1; i++)
        {
            nextKey = postedValues.AllKeys[i];
            if(nextKey.Substring(0, 2) != "__")
            {
                displayValues.Append("<br>");
                displayValues.Append(nextKey);
                displayValues.Append(" = ");
                displayValues.Append(postedValues[i]);
            }
        }
       Label1.Text = displayValues.ToString();
    }
    

Voir aussi

Tâches

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

Concepts

Publication entre pages dans des pages Web ASP.NET

Vue d'ensemble de la gestion d'état ASP.NET