IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Postback rafraîchit toute la page malgré l'UpdatePanel [Débutant]


Sujet :

ASP.NET

  1. #1
    Membre confirmé Avatar de Yosko
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2008
    Messages : 61
    Par défaut Postback rafraîchit toute la page malgré l'UpdatePanel
    Salut à tous,

    Toujours pas familiarisé avec les UpdatePanels, je reviens vers vous avec une nouvelle question :

    Pourquoi ma page se rafraîchit-elle complètement lors du Postback engendré par mon contrôle, alors que celui-ci se situe dans un UpdatePanel ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            ...
            <asp:DropDownList ID="ListService" runat="server" AutoPostBack="true"
                OnSelectedIndexChanged="ListService_SelectedIndexChanged" />
            ....
        </ContentTemplate>
    </asp:UpdatePanel>
    J'ai vérifié, et ce code n'est pas encapsulé par un autre UpdatePanel ayant ChildrenAsTriggers="true".

    Avez-vous des pistes sur ce qui pourrait poser le problème ?

  2. #2
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut UpdatePanel
    Personnellement, j'utilise une master avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <form id="form1" runat="server">
        <cc1:ToolkitScriptManager ID="TSM" runat="server" EnableHistory="false" ScriptMode="Release"
            LoadScriptsBeforeUI="true">
        </cc1:ToolkitScriptManager>
        <asp:UpdatePanel ID="UP" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <div id="Page">
                    <div id="Header">
                           </div>
                    <div id="Content">
                        <div id="Contenu">
                            <asp:ContentPlaceHolder ID="Contenu" runat="server">
                            </asp:ContentPlaceHolder>
                            <div>
                                <asp:LinkButton ID="lnkBack" runat="server" CausesValidation="False" CssClass="Small"
                                    PostBackUrl="~/Default.aspx">&lt;&lt; Page accueil</asp:LinkButton></div>
                        </div>
                    </div>
                    <div id="Bottom">
                                        </div>
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
        </form>
    Puis dans mes page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      <asp:UpdatePanel ID="UPMapCla" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:GridView ID="grdMappageClassement" ...>
     
                     </asp:GridView>
                </ContentTemplate>
            </asp:UpdatePanel>
    CE qui dit à ta page global de ne pas se recharger grâce à l'updatePanel de la master.
    Sinon l'idée pour faire simple est d'imbriquer 2 updatepanel un autour de toute la page, l'autre autour du composant.

    Si ça a répondu à ton pb, marque que ça "résolu"

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Je pense qu'il faut que tu définisses ta DropDownList comme étant un Trigger. Voici le plan d'action :

    1 - Met le paramètre ChildrenAsTriggers de l'UpdatePanel à False
    2 - Définit ton Trigger, un peu comme ceci :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Triggers>
        <asp:PostBackTrigger ControlID="ListService" EventName="SelectedIndexChanged" />
    </Triggers>

    Cela devrait solutionner ton problème en principe.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre confirmé Avatar de Yosko
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2008
    Messages : 61
    Par défaut
    Merci pour ces conseils. J'ai essayé les 2 méthodes, mais hélas aucune n'a porté ses fruits.

    Sur les conseils de BROWNY, j'ai ajouté un UpdatePanel "parent" dans ma masterpage, encadrant mon ContentPlaceHolder.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <asp:UpdatePanel ID="MainUpdatePanel" runat="server" UpdateMode="Conditional">
      <ContentTemplate>
        <div id="content">>
          <asp:ContentPlaceHolder ID="ContentPlaceHolderD" runat="server" Visible="true"/>
        </div>
      </ContentTemplate>
    </asp:UpdatePanel>
    J'avais déjà essayé la proposition de Matt07, mais l'ai retenté pas acquis de conscience : toujours rien...

    Je me suis aussi assuré que ce n'était pas lié au code behind appelé dans le postback. Rien n'y fait...
    J'ai aussi lu quelque part qu'il ne fallait pas mettre d'UpdatePanel à l'intérieur de tableaux (je ne sais pas vraiment pourquoi), mais ça n'est pas mon cas non plus...
    Bref je commence à désespérer.

    En réalité, ma page contient une série d'UpdatePanels consécutifs (et aucun UpdatePanel parent ou enfant, à l'origine). Seul le premier UpdatePanel me pose problème, tandis que les suivants se comportent comme attendu. J'ai comparé leurs code et n'ai pas vu de différence. A titre d'exemple, un extrait du suivant, rigoureusement identique (à l'exception des ID) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
      <ContentTemplate>
        ...
        <asp:DropDownList ID="ListSecteur" runat="server" AutoPostBack="true" 
          OnSelectedIndexChanged="ListSecteur_SelectedIndexChanged" />
        ...
      </ContentTemplate>
    </asp:UpdatePanel>

  5. #5
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Citation Envoyé par Yosko Voir le message
    Sur les conseils de BROWNY, j'ai ajouté un UpdatePanel "parent" dans ma masterpage, encadrant mon ContentPlaceHolder.
    Je n'ai pas d'idée particulière sur l'origine du problème. C'est comme si un contrôle en dehors de ton updatePanel était trigger de ce dernier.

    Par contre, une remarque : le conseil de Browny est une FBI (Fausse Bonne Idée). En effet, ça simplifie drôlement l'utilisation "d'Ajax"... Mais l'UpdatePanel est extrêmement peu performant. Et s'amuser à faire des rechargements "partiels" complets en collant toutes ces pages dans un UpdatePanel n'est pas vraiment une bonne idée.

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    C'est étrange... Je viens de faire un test chez moi et ça fonctionne bien. Voici le code.

    Le code de l'UI :
    Code ASPX : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <asp:UpdatePanel ID="upnl" runat="server" UpdateMode="Always">
        <ContentTemplate>
            <asp:DropDownList ID="ddl" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
                <asp:ListItem Text="Value1" Value="Value1"></asp:ListItem>
                <asp:ListItem Text="Value2" Value="Value2"></asp:ListItem>
            </asp:DropDownList>
     
            <asp:Label ID="lblRefreshTime" runat="server"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>

    Le code behind :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.lblRefreshTime.Text = DateTime.Now.ToLongTimeString();
    }

    En gros lorsqu'on déclenche l'évènement SelectedIndexChanged, on affiche l'heure du refresh dans le label "lblRefreshTime".
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre confirmé Avatar de Yosko
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2008
    Messages : 61
    Par défaut
    @calagan99 > merci pour ce warning.

    J'ai trouvé ce qui différenciait mes deux UpdatePanels, et j'ai trouvé un moyen de corriger mon problème.

    En réalité, ma page est un gros formulaire, découpé en section (Chaque section encapsulée d'un UpdatePanel, et comprenant un Panel de titre, un Panel de contenu et un CollapsiblePanelExtender). A chaque fois que le rechargement partiel fonctionne, c'est parce que les contrôles de mon Panel de contenu sont encadrés par un fieldset, et chaque fois que le rechargement se fait sur toute la page, c'est parce qu'il n'y a pas de fieldset.

    Un bout de code simplifié pour imager mes propos. UpdatePanel1 ne fonctionne pas, UpdatePanel2 fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <form ...>
      <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
          ...
          <asp:DropDownList ID="ListService" runat="server" AutoPostBack="true"
            OnSelectedIndexChanged="ListService_SelectedIndexChanged" />
          ....
        </ContentTemplate>
      </asp:UpdatePanel>
      <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
          <fieldset>
          <legend></legend>
            ...
            <asp:DropDownList ID="ListSecteur" runat="server" AutoPostBack="true" 
              OnSelectedIndexChanged="ListSecteur_SelectedIndexChanged" />
            ...
          </fieldset>
        </ContentTemplate>
      </asp:UpdatePanel>
    </form>
    Après, si vous avez une explication du pourquoi de ce comportement, je suis preneur.

    Je note ça résolu, en tout cas. Merci de votre aide.

    EDIT : j'ajoute que le <fieldset> DOIT contenir une <legend> (même vide) !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/06/2013, 16h37
  2. [HTML] Tableaux sur toute une page
    Par tails dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 12/04/2005, 12h29
  3. [W3C] rendre toutes les pages visibles
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 31/01/2005, 19h07
  4. [CR.NET] affichage de toute les pages de l'état
    Par HULK dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 19/01/2005, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo