IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ ASP.NET/C#

FAQ ASP.NET/C#Consultez toutes les FAQ

Nombre d'auteurs : 39, nombre de questions : 371, dernière mise à jour : 15 juin 2021 

 
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
string id;
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.

Mis à jour le 23 mai 2005  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 void ClickLien(object sender, EventArgs e)
{
	Server.Transfer("~/Page2.aspx");
}

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 string GetValue()
{
	return MonTxtBox.Text;
}

on pourra faire par exemple dans le OnLoad de la Page2

 
Sélectionnez
MonLabel.Text = ((Default)PreviousPage).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
Default previousPage = PreviousPage as Default;
if (previousPage != null)
{
	//...
}

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 new Default PreviousPage {
	get { return ((Default)(base.PreviousPage)); }
}

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 n'est pas dans un postback pour alimenter les données.

 
Sélectionnez
protected override void OnLoad(EventArgs e)
{
   if (!IsPostBack)
   {
      // code à placer pour alimenter le contrôle
   }
}
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 ni 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.