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
Imaginons ce bout de code sur une page appellée via l'url : http://localhost/mapage.aspx?id=1
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.
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 :
<
TextBox ID=
"MonTxtBox"
runat=
"server"
/>
<
asp:
LinkButton runat=
"server"
OnClick=
"ClickLien"
Text=
"Changer de page"
/>
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,
public
string
GetValue
(
)
{
return
MonTxtBox.
Text;
}
on pourra faire par exemple dans le OnLoad de la Page2
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 :
<
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
Default previousPage =
PreviousPage as
Default;
if
(
previousPage !=
null
)
{
//...
}
PreviousPage peut être également fortement typée en rajoutant une directive dans la page destination.
<%
@ PreviousPageType VirtualPath=
"~/Default.aspx"
%>
ce qui fait que dans le codebehind, on aura plus besoin de cast et on pourra utiliser directement
MonLabel.
Text =
PreviousPage.
GetValue
(
);
En fait, le designer nous surchage simplement la propriété :
public
new
Default PreviousPage {
get
{
return
((
Default)(
base
.
PreviousPage));
}
}
Ce qui lèvera une exception si jamais on vient d'une autre page ...
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.
protected
override
void
OnLoad
(
EventArgs e)
{
if
(!
IsPostBack)
{
// code à placer pour alimenter le contrôle
}
}
On examinera la valeur de Request.Form["__EVENTTARGET"] qui contiendra l'uniqueId du contrôle qui a déclenché le postback