begin process at 2008 05 17 07:26:48
1 173 919 membres
51 nouveaux aujourd'hui
13 973 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ASP.NET 2.0 : POSTBACK ET CROSS-POSTBACK D'UNE PAGE À L'AUTRE


Information sur le tutorial

Catégorie :ASP.Net Tutorial .NET ( DotNet ) Date de création : 24/01/2006 23:35:26 Vu : 28 459 fois

Note :
9,33 / 10 - par 3 personnes
9,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

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

Tutorial

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

 

24 janvier 2006 23:40:36 :
correction de style
24 janvier 2006 23:46:40 :
corection de style
  • signaler à un administrateur
    Commentaire de jesusonline le 25/01/2006 00:28:50 administrateur CS

    Article trés interessant :)

    A savoir aussi qu'il existe une autre technique moins connu en asp.net1.1 pour passer des paramètres page par page, au lieu de faire un response.Redirect on peut utiliser un response.transfer, ce qui permet de garder les en-tete HTTP, on peut donc recuperer les différents champs selon l'ancienne méthode : Request.Form("name")

  • signaler à un administrateur
    Commentaire de Nurgle le 25/01/2006 13:19:23 administrateur CS

    Très bon tutorial en effet :D

    Pour la 1ère méthode de récupération, elle peut très bien fonctionner pour une structure de page complexe du fait que la méthode FindControl a cette overload : FindControl(string id,int pathOffset), où pathOffset, si je me souviens bien, permet d'étendre la recherche dans plusieurs controles sous la hiérarchie de controles de la page.

    Cyril --> C'est pas plutôt Server.Transfer ?! :P

  • signaler à un administrateur
    Commentaire de jesusonline le 25/01/2006 16:05:23 administrateur CS

    vivi c'est bien server.transfer ... *-)

  • signaler à un administrateur
    Commentaire de poupouille55 le 04/05/2006 15:06:23

    très bon tutoriel effectivement !
    Par contre j'ai essayer les différente méthode est impossible de récupérer mes variables !
    un utilisateur clique sur un lien qui ouvre une nouvelle page. Dans cette page, il choisit le/les destinataires à qui il désire envoyer le mail. ces informations sont renvoyé a la page principale qui permet l'envoi de mail.
    pourquoi cela ne fonctionne -t-iil pas ?
    avec la première méthode, il y a bien un valeur dans Session(" ") mais ès que je veux affiche cette valeur dans une autre page, cela ne marche pas.
    J'utilise vb.net.
    Si quelqu'un a une petite idée ... s'il vous plait n'hésiter pas à m'aider !!!!
    Merci

  • signaler à un administrateur
    Commentaire de danielt92 le 04/05/2006 23:33:48

    Papouille55,
    As-tu bien fait attention à la casse de tes variables de session ?
    Peux-tu nous mettre tes bouts de code ou tes fichiers qui posent problème ?
    Daniel

  • signaler à un administrateur
    Commentaire de poupouille55 le 05/05/2006 09:27:12

    ça, c'est le lien de la page principale. ce lien permet d'ouvrir une nouvelle fenêtre appelée repertoire.
      <asp:HyperLink ID="HpLkRepertoire" runat="server" NavigateUrl="~/repertoire.aspx" Width="163px">Accéder à mon répertoire</asp:HyperLink><br />

    ce code associé a la page principale, permet de récupérer la valeur choisi dans la page repertoire.aspx
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            lbTest.Text = Session.Item("destinataire")
        End Sub

    et ce code la, associé a la page repertoire permet d'envoyer la valeur du destinataire choisi a la page principale (default.aspx):
      Protected Sub btnConfDest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnConfDest.Click
            Session.Add("test", tbTest.Text)
            Response.Redirect("Default.aspx")
        End Sub

    j'ai refait un test hier. j'ai réutilisé la méthode avec session. mais cette fois, dans l'autre sens. c'est à dire que c'est la page principale qui envoyait une valeur a la page repertoire.aspx, et ça a fonctionné correctement. est-ce que mon erreur ne viendrait du fait que la valeur ne provient pas de la page  principale ?? ou alors, le fait que j'appelle une nouvelle fenêtre à l'aide d'un lien serait il le problème. est-il possible d'envoyer une variable d'une page à une page principale ?
    je réexplique parce que je ne sais pas si j'ai été clair hier:
    dans ma page principale, j'ai un lien. celui me redirige vers la page repertoire.aspx.
    dans cette page, je sélectionne mon/mes destinataire(s). les destinataires choisis sont répertoriés dans une listbox.je renvoie ces valeurs vers la page principale et j'aimerai s possible les récupérer dans une listBox.sauf si bien sur il y a un moyen plus simple.

    Merci beaucoup pour votre aide, car je ne sais plus comment faire pour résoudre cette histoire

  • signaler à un administrateur
    Commentaire de poupouille55 le 05/05/2006 09:28:57

    ah oui j'ai oublié de précisé il ya une petite faute dans mon code, mais même en la corrigeant, ça ne marche pas:
    Session.Add("destinataire",tbTest.text) au lieu de Session.Add("test",tbTest.text)

  • signaler à un administrateur
    Commentaire de poupouille55 le 05/05/2006 15:26:18

    bonjour tout le monde ! je suis d'humeur joviale aujourd'hui et pour cause j'ai résolu mon problème !! enfin en partie
    j'ai toujours un lien dans ma page principale, ce lien m'emmène vers une page aspx: repertoire.aspx
    dans cette page, j'ai un bouton (btnConfDest). Il me permet, une fois que l'utilisateur a choisi le destinataire a qui il veut envoyer le mail, d'envoyer l'info vers la page principale
    Cette info est passée par l'url.
    Public Sub btnConfDest_Click(ByVal sender As Object, ByVal e As System.EventArgs)_ Handles btnConfDest.Click
            Dim destinataire As String
            destinataire = tbTest.Text
            Response.Redirect("Default.aspx?destinataire=" + destinataire)
        End Sub


    Voila, ma page principale récupère les données envoyées dans une collection
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim destinataire As String
            Dim MyColl As NameValueCollection
            MyColl = Request.QueryString
            destinataire = MyColl.Get("destinataire")
            lbTest.Text = destinataire 'et on affiche la données dans une textbox
        End Sub

    le problème qu'il me reste à résoure, c'est comment passer plusieurs variables (qui corespondrait a plusieurs destinataires choisi par l'utilisateur) par l'url. peut on passer carrément un objet, par exemple une listbox ???

    Merci, j'espère que mon pti bout de code va aider quelques personnes

  • signaler à un administrateur
    Commentaire de mael974 le 17/05/2006 16:52:26

    Salut tuto nikel pr une intro!!
    Ms jai qd mm un ti souci, ds la mesure ou mon TextBox est encapsuler ds un FormView qui lui mm est ds une page maitre .....vs voyez laffaire???? De ce faite jarrive pas a recuperer mes donnés :

    page source :
    ----------------
    ....
    <asp:FormView ID="FormView1" runat="server" DataKeyNames="CLI_ID" DataSourceID="dsclient" DefaultMode="Insert"  >
    ....
    <asp:TextBox ID="Nom"  runat="server" Text='<%# Bind("CLI_NOM") %>'>
                </asp:TextBox>

    <asp:LinkButton ID="InsertButton" runat="server" PostBackUrl="~/FinCreeClient.aspx" CausesValidation="True" CommandName="Insert"
                    Text="Enregistrer">
                </asp:LinkButton>

    Ma page destination : (qui ne recupere rien)

    Partial Class FinCreeClient
        Inherits System.Web.UI.Page
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

            If Not Page.IsPostBack Then
                Label2.Text = CType(Page.PreviousPage.Master.FindControl("Content1").FindControl("FormView1").FindControl("Nom"), TextBox).Text

            End If

        End Sub
    End Class

    Tu pourré me donne un ti coup de pouce stp !! merci

  • signaler à un administrateur
    Commentaire de mael974 le 17/05/2006 16:55:19

    Ps: jai oublie de dire que le tt est liee a une base de donnee ( ms je pense pas que sa change la donne!!!)

  • signaler à un administrateur
    Commentaire de danielt92 le 17/05/2006 22:51:55

    Ajoutes l'attribut Trace="true" dans la directive @Page de ta page ASPX, et regardes si tu trouves ton TextBox dans la hierarchie de des contrôles.

  • signaler à un administrateur
    Commentaire de mael974 le 18/05/2006 10:02:27

    mon textbox apparait bien ds ma hierarchie!! jai trj une erreur lorsque je valide, une boite de dialogue avec l'erreur : NullReferenceException was unhdled user code

    Objet reference not set to an instance of an objet !!! qui pointe sur ma ligne
    CType(Page.PreviousPage.Master.FindControl("Content1").FindControl("FormView1").FindControl("Nom"), TextBox).Text

    Des que je sors la texbox de ma page maitre et de mon formview , no pbl !!!!
    Help mee please

  • signaler à un administrateur
    Commentaire de mael974 le 18/05/2006 14:43:58

    L erreur vien de la page maitre car si je teste juste le formulaire dans une page maitre sans formview , ca ne marche trjs pas !!!
    c'est bien cette ligne qui pose pbl :
    Label1.Text = CType(Page.Master.FindControl("Content1").FindControl("box"), TextBox).Text
    jai trouvé aucune solution :(

  • signaler à un administrateur
    Commentaire de ssr972 le 06/08/2006 20:04:44

    Question stupide...
    Débutant totalement en asp.net 2 et venant de l'asp...
    Comment pourrai je convertir le code de la solution 3 en c# ??
    Merci d'avance.

  • signaler à un administrateur
    Commentaire de dadou74 le 13/09/2006 10:49:36

    Voici un lien vers un traducteur VB <-> C# qui marche pas mal

    http://www.carlosag.net/Tools/CodeTranslator/Default.aspx

  • signaler à un administrateur
    Commentaire de mahaabdallah le 18/12/2007 17:00:41

    et pour l asp.net 2.0 comment on fait si on remplie une arborescence (treeview) à partir d'une base de donnée donc dans la prtie dynamique perso je charge mon treeview sauf que j'arrive à trouvé les bonnes fonction pour selectionner mon noeud ou la récupérer étant donné que .net 1.1 est orianté index et .net 2.2 est orianté objet??!!!!!!!! je rame :p

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Boutique

Boutique de goodies CodeS-SourceS