ASP.NET 2.0 : PostBack et Cross-PostBack d'une page à l'autre
Introduction
Une question revient souvent lorsqu'on débute en ASP.NET : comment transmettre les données d'un formulaire ASPX à un autre. Ce tutorial explique les différentes techniques disponibles en ASP.NET et surtout en ASP.NET 2.0
Le Post-Back
Le post-back est le modèle utilisé en ASP.NET pour transmettre les données d'un formulaire HTML avec la méthode POST. Ce modèle consiste à afficher et à traiter les données recueillies du formulaire sur la même page ASPX. Poster un formulaire sur lui-même permet aux contrôles de la page de non seulement obtenir une progammation événementielle, mais aussi de conserver leur état entre chaque Post. Le postback est également utilisé par défaut en ASP.NET 2.0
Pour passer des paramètres complexes d'une page à l'autre, on utilise généralement la Session, puis la commande Response.Redirect

PageSource.aspx

Lorsque l'utilisateur clique sur le bouton Envoyer, le formulaire de la page PageSource.aspx est posté sur la même page ce qui provoque l'exécution côté serveur de la méthode associée au click du bouton.
L'objet Session permet d'enregistrer des variables pour un utilisateur donné, afin de pouvoir les relire depuis d'autres pages de la même application Web. La méthode Response.Redirect permet lors d'un Post-Back de ne pas renvoyer la page courante dans la réponse HTTP, mais de renvoyer une réponse demandant au navigateur Web du client de réclamer une autre page.

PageDestination.aspx


La page de destination étant appelée lors d'un GET suite au Response.Redirect, on ne récupère les données stockées en session que lors de cette première demande. Lors des demandes suivantes, le label est repeuplé automatiquement suite au PostBack grâce au Viewstate...
La technique du Response.Redirect est largement éprouvée en ASP et en ASP.NET, mais a pour inconvénient de provoquer un aller-retour entre le serveur et le client, même si l'utilisateur ne se rends compte de rien.
Le Cross Post-Back
Le cross post-back est une nouveauté d'ASP.NET 2.0 qui permet de poster des données d'une page ASPX vers une autre au lieu de les poster sur elle-même. La page de destination possède une propriété permettant de récupérer plus ou moins facilement les données contenues dans la page source, selon le niveau d'encapsulation et le niveau de dépendance souhaité entre les 2 pages concernées.

PageSource.aspx

Lorsque l'utilisateur clique sur le bouton Envoyer, le formulaire de la page PageSource.aspx est directement posté sur la page de destination grâce à l'ajout d'un attribut PostBackUrl sur le Tag du bouton.
Le code défini dans les procédures événementielles Page_Init, Page_Load, Evénement_Change, Evénement_Action, Page_PreRender de la page source est tout de même exécuté au moment où la page de destination fait référence à cette dernière par l'intermédiaire de sa propriété Page.PreviousPage, afin d'y récupérer des données.
Le code éventuellement exécuté sur la page source, suite à un cross-postback ne peut en aucune manière modifier le rendu HTML de la page de destination. Le test de la valeur de la propriété Page.IsCrossPagePostBack permet cependant d'éviter l'exécution de code inutile dans ce mode.
Par exemple, on peut désactiver le code associé au bouton cmdSend, comme suit, à défaut de le supprimer complètement.

PageDestnation.aspx
La récupération des données de la page source depuis la page de destination peut-être faite de 3 manières, au moins :
Première méthode : Parcourir l'arbre des contrôles de la page Source
Cette méthode est la plus simple à mettre en oeuvre si la page de destination connait exactement la structure de la page source attendue.
Le code suivant montre comment rechercher la valeur de la propriété Text d'un TextBox de la page source appelé txtNom.
La méthode FindControl n'étant récursive que sur la hiérarchie des contrôles de son propre container, elle fonctionne bien lorsque la structure de la page est simple et ne change pas dans le temps.
Si la page source est une ContentPage, c'est à dire utilise une MasterPage, le code à écrire serait celui-ci :
lblName.Text = Ctype(Page.PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("txtNom"), TextBox).Text
Deuxième méthode : Le couplage fort entre les 2 pages
Cette méthode consiste à transtyper l'objet Page obtenu par l'appel à la propriété Page.PreviousPage ver le type exact de la page source.
Dans la page source, il faut alors déclarer des membres publics exposant les données ou fonctionnalités souhaitées.
Dans la page de destination, il faut explicitement faire référence à la page source, par l'ajout d'une directive @PreviousPage dans la page ASPX
et dans la page aspx.vb,
L'inconvénient de cette méthode est, vous l'avez compris, que la page de destination s'attend à récupérer les données d'une page en particulier. On ne peut donc pas faire converger plusieurs pages vers cette page de destination par un CrossPost.
Troisième méthode : Le couplage faible entre les pages
Cette méthode consiste à passer par une interface, pour échanger les informations, ce qui permet à plusieurs pages implémentant cette interface, de fournir des données à une page de destination par un CrossPost.
Il faut donc créer une interface qui sera placée dans le répertoire App_Code, et donc connue de toutes les pages ASPX du site Web.
La page source doit alors implémenter l'interface
La page de destination n'a plus qu'à récupérer les informations, en passant par l'interface
Conclusion
Le Post de données d'un formulaire à l'autre n'est pas quelque chose de révolutionnaire en soi, puisque c'est disponible en HTML pur, et classique en ASP. Le modèle de développement à base de WebForms ASPX nous avait fait oublier cette fonctionnalité pourtant naturelle, mais incompatible jusqu'à présent en ASP.NET.
ASP.NET 2.0 nous fait découvrir ou redécouvrir cette fonctionnalité, plus efficace que la technique du Response.Redirect, mais tout en conservant l'élégance de .NET.
Daniel TIZON
http://blogs.developpeur.org/daniel