Developpez.com

Une très vaste base de connaissances en informatique avec
plus de 100 FAQ et 10 000 réponses à vos questions

FAQ ASP.NET/VB.NETConsultez toutes les FAQ

Nombre d'auteurs : 38, nombre de questions : 369, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireGestion de l'étatTransferer des données entre les pages

Imaginons ce bout de code sur une page appellée via l'url : http://localhost/mapage.aspx?id=1

 
Sélectionnez

Dim id As String 

id = Request.Params("id")
				

id aura "1" comme valeur. Il s'agit bien de la chaîne de caractères "1" et non le chiffre 1.

Créé le 6 novembre 2003  par David Pedehourcq

Une manière très simple de récupérer des valeurs d'une page à l'autre est d'utiliser Server.Transfert qui permet de terminer l'exécution de la page courante et d'enchainer sur une nouvelle page.
Cela peut s'utiliser comme ca :

 
Sélectionnez

<TextBox ID="MonTxtBox" runat="server" />
<asp:LinkButton runat="server" OnClick="ClickLien" Text="Changer de page" />
 
Sélectionnez

Protected Sub ClickLien(ByVal sender As Object, ByVal e As EventArgs)
	Server.Transfer("~/Page2.aspx")
End Sub

L'avantage de cette utilisation est qu'on peut aisément récupérer la valeur de notre textbox par exemple dans la Page2, en utilisant la propriété PreviousPage et en la castant avec le bon type.
En imaginant que la page expose une propriété publique de ce genre,

 
Sélectionnez

Public Function GetValue() As String
	Return MonTxtBox.Text
End Function

on pourra faire par exemple dans le OnLoad de la Page2

 
Sélectionnez

MonLabel.Text = CType(PreviousPage, _Default).GetValue()

Ceci permet également de faire transiter des objets plus complexes que des strings. Imaginons que dans ma première page j'ai construit une collection de liste de chaipakoi, il sera alors très simple de cette facon de la faire transiter jusqu'à la page suivante.
Asp.Net 2.0 ajoute la notion de cross page posting, à savoir que l'exemple ci-dessous pourra se transformer en :

 
Sélectionnez

<asp:LinkButton runat="server" PostBackUrl="~/Page2.aspx" Text="Changer de page" />

Notez la propriété PostBackUrl qui nous enlève la gestion du Server.Transfert et qui évite de faire une étape intermédiaire en repassant par la page Default. Nous sommes également déchargé de la gestion du handler sur le click de bouton.
Toutefois, l'utilisation de la propriété PreviousPage dans la Page2 nous fait repasser dans le OnInit, OnLoad... de la page Default. On pourra éventuellement contrôler les actions à y effectuer en testant la propriété IsCrossPagePostBack qui indiquera si nous sommes en train de faire un cross page posting.
Les deux concepts sont quasiments équivalent.
Une différence majeure est que dans le cas de l'utilisation de Server.Transfert, le navigateur n'est pas au courant du transfer, et un effet visible sera que l'url reste inchangée.
Dans le cas d'un cross page, l'url sera la bonne.
NB : il pourra être intéressant d'effectuer quelques vérifications supplémentaires, notamment pour être bien sur que l'on récupère la page attendu comme PreviousPage, et transformer le basique cast du dessus en

 
Sélectionnez

Dim previousPage As _Default = previousPage
If Not previousPage Is Nothing Then
	' ...
End If

PreviousPage peut être également fortement typée en rajoutant une directive dans la page destination.

 
Sélectionnez

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

ce qui fait que dans le codebehind, on aura plus besoin de cast et on pourra utiliser directement

 
Sélectionnez

MonLabel.Text = PreviousPage.GetValue();
				

En fait, le designer nous surchage simplement la propriété :

 
Sélectionnez

Public Shadows ReadOnly Property PreviousPage() As WebApplication2.[Default]
	Get
		Return CType(MyBase.PreviousPage, WebApplication2.[Default])
	End Get
End Property
				

Ce qui lèvera une exception si jamais on vient d'une autre page ...

Créé le 10 mars 2008  par nico-pyright(c)

C'est un cas très fréquent lors de l'alimentation du contrôle dans le OnLoad (une dropdown par exemple). Il faut vérifier qu'on est pas dans un postback pour alimenter les données.

 
Sélectionnez

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
	If Not IsPostBack Then
		' code à placer pour alimenter le contrôle
	End If
End Sub
Créé le 10 mars 2008  par nico-pyright(c)

On examinera la valeur de Request.Form["__EVENTTARGET"] qui contiendra l'uniqueId du contrôle qui a déclenché le postback

Créé le 10 mars 2008  par nico-pyright(c)

Lien : Parfois ma dropdownlist ne lève pas l'événement OnSelectedIndexChanged ou OnTextChanged, même si AutoPostBack='true', que faire ?

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2007 Dotnet Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.