FAQ ASP.NET/VB.NET
FAQ ASP.NET/VB.NETConsultez toutes les FAQ
Nombre d'auteurs : 38, nombre de questions : 369, dernière mise à jour : 16 juin 2021
Imaginons ce bout de code sur une page appellée via l'url : http://localhost/mapage.aspx?id=1
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.
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
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,
Public
Function
GetValue
(
) As
String
Return
MonTxtBox.Text
End
Function
on pourra faire par exemple dans le OnLoad de la Page2
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 :
<
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
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.
<
%@ 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
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 ...
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.
Protected
Overrides
Sub
OnLoad
(
ByVal
e As
System.EventArgs
)
If
Not
IsPostBack Then
' code à placer pour alimenter le contrôle
End
If
End
Sub
On examinera la valeur de Request.Form["__EVENTTARGET"] qui contiendra l'uniqueId du contrôle qui a déclenché le postback