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
Sommaire→Gestion de l'état→Transferer des données entre les pagesImaginons 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 SubL'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 Functionon 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 PropertyCe 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 SubOn examinera la valeur de Request.Form["__EVENTTARGET"] qui contiendra l'uniqueId du contrôle qui a déclenché le postback



