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 Ajax Discussion :

Comprendre à quoi sert ScriptManager.RegisterAsyncPostBackControl(Control)


Sujet :

ASP.NET Ajax

  1. #1
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut Comprendre à quoi sert ScriptManager.RegisterAsyncPostBackControl(Control)
    Bonjour,


    Comme écrit dans le titre, je cherche à comprendre l'intérêt de la méthode RegisterAsyncPostBackControl(Control) de l'objet ScriptManager

    Voici ma page aspx :
    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
    <%@ Page Language="C#" MasterPageFile="~/Main.Master" AutoEventWireup="true" CodeFile="PageTestUpdatePanel.aspx.cs" Inherits="TEST_PageTestUpdatePanel" %>
     
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
     
    <asp:Content ID="Content2" ContentPlaceHolderID="Left" Runat="Server">
     
        <div>
            <asp:UpdatePanel runat="server" ID="uPanelA" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonA" Text="clic on button A" OnClick="buttonA_Click" />
                    <asp:TextBox runat="server" ID="textboxA"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
     
            <asp:UpdatePanel runat="server" ID="uPanelB" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonB" Text="clic on button B" OnClick="buttonB_Click" />
                    <asp:TextBox runat="server" ID="textboxB"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
     
    </asp:Content>
    avec le code behind associé suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        protected void Page_Load(object sender, EventArgs e)
        {
        }
     
        protected void buttonA_Click(object sender, EventArgs e)
        {
            textboxA.Text = "testA";
            textboxB.Text = "testB";
        }
        protected void buttonB_Click(object sender, EventArgs e)
        {
        }
    Dans le but de comprendre la méthode RegisterAsyncPostBackControl(Control), je cherche à coder le comportement suivant, par programme :
    Je veux que quand je clique sur buttonA, uPanelB soit rafraichit.
    (Dans le code ci dessus, uPanelB N'EST PAS mis à jour)

    J'arrive déjà à faire cela de 2 façons :
    Façon n°1 : en ajoutant de façon déclarative une balise asp:AsyncPostBackTrigger :

    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
            <asp:UpdatePanel runat="server" ID="uPanelA" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonA" Text="clic on button A" OnClick="buttonA_Click" />
                    <asp:TextBox runat="server" ID="textboxA"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
     
            <asp:UpdatePanel runat="server" ID="uPanelB" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonB" Text="clic on button B" OnClick="buttonB_Click" />
                    <asp:TextBox runat="server" ID="textboxB"></asp:TextBox>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="buttonA" />
                </Triggers>
            </asp:UpdatePanel>
    et le même code behind que précédemment.

    Façon n°2 : utilisation de la méthode Update() dans le code behind :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            <asp:UpdatePanel runat="server" ID="uPanelA" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonA" Text="clic on button A" OnClick="buttonA_Click" />
                    <asp:TextBox runat="server" ID="textboxA"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
     
            <asp:UpdatePanel runat="server" ID="uPanelB" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonB" Text="clic on button B" OnClick="buttonB_Click" />
                    <asp:TextBox runat="server" ID="textboxB"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
    associé au code behind suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        protected void Page_Load(object sender, EventArgs e)
        {
        }
     
        protected void buttonA_Click(object sender, EventArgs e)
        {
            textboxA.Text = "testA";
            textboxB.Text = "testB";
    	uPanelB.Update();
        }
        protected void buttonB_Click(object sender, EventArgs e)
        {
        }


    J'aimerais maintenant arriver à le faire d'une 3ème façon avec la méthode RegisterAsyncPostBackControl(Control) ...

    Moi je me dis il faudrait faire comme ça :

    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
        protected void Page_Load(object sender, EventArgs e)
        {
            ScriptManager sm1 = Page.Master.FindControl("ScriptManager1") as ScriptManager;
            sm1.RegisterAsyncPostBackControl(buttonA); // Ca sert à quoi de faire ça ?
    		// buttonA déclenche déjà un postBack asynchrone de uPanelA !!
    		// Moi ce que je cherche à faire c'est de dire : "buttonA, déclenche moi aussi le postback asynchrone de uPanelB"
    		// Là pour moi cette méthode aurait de l'intérêt. Il me faudrait un second argument dans cette méthode où on mettrait les zones cibles à rafraîchir.
        }
     
        protected void buttonA_Click(object sender, EventArgs e)
        {
            textboxA.Text = "testA";
            textboxB.Text = "testB";
        }
        protected void buttonB_Click(object sender, EventArgs e)
        {
        }
    Est il possible de faire ce que j'ai mis en commentaire de cette façon ?
    Et sinon, OK, mais pouvez vous m'expliquez l'intérêt de la méthode RegisterAsyncPostBackControl(Control) ?
    Dans quel cas peut on l'utiliser de manière utile ?


    Merci de votre aide.

  2. #2
    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 : 41
    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
    Il te faudra de toute façon raffraichir ton UpdatePanel avec un .Update() après le postback partiel.
    Donc autant ne pas se prendre la tête et définir la logique de mise à jour de tes deux UpdatePanels dans un seul event dans lequel tu les mets tous les deux à jour.

  3. #3
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    Merci de ta réponse.
    Cependant, mon but est vraiment de comprendre l'intérêt de cette méthode serveur.

    Alors je pense avoir trouvé une façon d’utiliser cette méthode de manière utile :
    Couplée à l'utilisation d'un UpdatePanel ayant sa prorpiété ChildrenAsTriggers à false.

    A qui cela sert de mettre ChildrenAsTriggers à false ?
    Voici une explication trouvée ici, dans la conclusion :
    http://dotnet.developpez.com/ajax/aj...panel-trigger/
    Afin de réduire la charge de traitement du serveur, il est recommandé que la propriété ChildrenAsTriggers d'un UpdatePanel soit mise à false et que les événements soient choisis plutôt qu'inclus par défaut. Cela évite également que des événements inutiles ne causent potentiellement des effets indésirables, comme par exemple la validation, et des modifications sur des champs de saisie. Ces types de bugs peuvent être difficiles à isoler, car la mise à jour de la page est transparente pour l'utilisateur, et la cause peut donc ne pas être immédiatement évidente.
    Donc j'ai essayé de coder cela.
    En reprenant mon exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            <asp:UpdatePanel runat="server" ID="uPanelA" UpdateMode="Conditional" ChildrenAsTriggers="false">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonA" Text="clic on button A" OnClick="buttonA_Click" />
                    <asp:TextBox runat="server" ID="textboxA"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
     
            <asp:UpdatePanel runat="server" ID="uPanelB" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonB" Text="clic on button B" OnClick="buttonB_Click" />
                    <asp:TextBox runat="server" ID="textboxB"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
    avec le code behind suivant :

    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
        protected void Page_Load(object sender, EventArgs e)
        {
            AjaxControlToolkit.ToolkitScriptManager sm1 = Page.Master.FindControl("ScriptManager1") as AjaxControlToolkit.ToolkitScriptManager;
            sm1.RegisterAsyncPostBackControl(buttonA);
     
            //ScriptManager sm1 = Page.Master.FindControl("ScriptManager1") as ScriptManager;
            //sm1.RegisterAsyncPostBackControl(buttonA);
        }
     
        protected void buttonA_Click(object sender, EventArgs e)
        {
            textboxA.Text = "testA";
            textboxB.Text = "testB";
        }
        protected void buttonB_Click(object sender, EventArgs e)
        {
        }
    Donc je dis avec ChildrenAsTriggers = false que les publications à partir des contrôles enfants de uPanelA ne mettent à jour le contenu de uPanelA.
    MAIS, dans l'évènement Load de ma page, avec ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            AjaxControlToolkit.ToolkitScriptManager sm1 = Page.Master.FindControl("ScriptManager1") as AjaxControlToolkit.ToolkitScriptManager;
            sm1.RegisterAsyncPostBackControl(buttonA);
    je rétablis le comportement par défaut de buttonA, enfant de uPanelA.
    Enfin je crois le faire car cela ne fonctionne pas, buttonA ne rafraichit pas uPanelA...

    Pourquoi ? Est ce que c'est moi qui ne comprends rien a cette méthode ??


    C'est étrange car j'arrive à produire le comportement que je veux de cette façon :

    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
            <asp:UpdatePanel runat="server" ID="uPanelA" UpdateMode="Conditional" ChildrenAsTriggers="false">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonA" Text="clic on button A" OnClick="buttonA_Click" />
                    <asp:TextBox runat="server" ID="textboxA"></asp:TextBox>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="buttonA" />
                </Triggers>
            </asp:UpdatePanel>
     
            <asp:UpdatePanel runat="server" ID="uPanelB" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button runat="server" ID="buttonB" Text="clic on button B" OnClick="buttonB_Click" />
                    <asp:TextBox runat="server" ID="textboxB"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
    et le code behind suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        protected void Page_Load(object sender, EventArgs e)
        {
        }
     
        protected void buttonA_Click(object sender, EventArgs e)
        {
            textboxA.Text = "testA";
            textboxB.Text = "testB";
        }
        protected void buttonB_Click(object sender, EventArgs e)
        {
        }
    A mon avis je comprends rien.
    A quoi sert réellement cette méthode serveur RegisterAsyncPostBackControl ?
    Quelqu'un peut il m'expliquer ?

  4. #4
    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 : 41
    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
    La MSDN est on ne peut plus claire : la méthode inscrit un contrôle comme déclencheur (trigger) de publications (postback) asynchrones.
    Mais, de l'expérience que j'en ai (je peux me tromper), il faut malgré tout mettre à jour manuellement un UpdatePanel, même après déclenchement d'un postback partiel par un contrôle inscrit comme trigger de publication partielle.
    Autrement dit, il faut faire appel à la méthode Update et l'utilisation de la méthode RegisterAsyncPostbackControl me semble donc limitée.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    je viens de tester l'utilité de cette fonction, ça permet de mettre un jour un élément de ton update panel sans rafraichir toute ta page, à partir d'un boutton qui est à l'extérieur de ton update panel, grâce à toi j'ai découvert une fonction qui me sera utile (j'en avais besoin pour mon site web )

  6. #6
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    je viens de tester l'utilité de cette fonction, ça permet de mettre un jour un élément de ton update panel sans rafraichir toute ta page, à partir d'un boutton qui est à l'extérieur de ton update panel, grâce à toi j'ai découvert une fonction qui me sera utile (j'en avais besoin pour mon site web )
    De quelle fonction parles tu ?
    Update() des UpdatePanel ?
    RegisterAsyncPostbackControl() de ScriptManager ?

    Citation Envoyé par calagan99
    Mais, de l'expérience que j'en ai (je peux me tromper), il faut malgré tout mettre à jour manuellement un UpdatePanel, même après déclenchement d'un postback partiel par un contrôle inscrit comme trigger de publication partielle.
    Oui c'est bien je que je constate ...Je vois même pas un intérêt limité, j'en vois aucun pour l'instant.

    Merci de votre aide. Je laisse le sujet ouvert quelque temps.

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    bein par exemple tu veux modifier le contenu de la textbox qui est dans ton update panel depuis l'extérieur (un exemple vaut mieu que des mots)
    dans ma page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <body>
        <form id="form1" runat="server">
            <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server"/>
            <asp:UpdatePanel runat="server" ID="uPanelA">
                <ContentTemplate>
                    <asp:TextBox runat="server" ID="textboxA"></asp:TextBox>
                </ContentTemplate>
            </asp:UpdatePanel>
            <asp:Button runat="server" ID="button1" Text="clic on button A" OnClick="buttonA_Click" />
            <asp:Button runat="server" ID="button2" Text="clic on button B" OnClick="buttonA_Click" />
            </div>
        </form>
    </body>
    dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     protected void Page_Load(object sender, EventArgs e)
        {
            ScriptManager1.RegisterAsyncPostBackControl(button1);
        }
     
        protected void buttonA_Click(object sender, EventArgs e)
        {
            textboxA.Text = "testA";
        }
    tu verras que le click sur le boutton A ne génère pas de rafraichissement sur la page alors que le clique sur le boutton B si

  8. #8
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    @ youtpout978

    OK, on voit bien que buttonA ne provoque pas le postback synchrone de la page complète.
    Alors que buttonB si.

    Donc la fonction RegisterAsyncPostBackControl a un effet.

    MAIS, par contre, le rafraichissement de uPanelA ne se fait pas ! (textboxA ne prend pas la valeur "testA")
    On est obligé de faire un :
    pour que ce panel se rafraichisse.

    Donc comme le dit calagan99 ===> intérêt limité ..

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    bein si le textbox prend la valeur testA j'ai utilisé plusieur fois les updatepanel mais j'ai jamais eu à utiliser le Update(), as-tu copié le code exact que je t'ai mis (c'est UpdateMode="Conditional" qui oblige l'utilisation du .Update())

  10. #10
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    Oui tu as raison, j'avais mis UpdateMode="Conditionnal".
    Je met toujours cette propriété à Conditionnal en fait.

    Parce que sinon, le contenu du panneau est toujours mis à jour, à n'importe quelle publication synchrone ou asynchrone de n'importe quel contrôle en dehors ou à l'intérieur de cet UpdatePanel....
    C'est pas comme ça que j'utilise les UpdatePanel, mais tu m'as peut être fait comprendre l'intérêt des UpdatePanel qui ont la propriété UpdateMode="Always".

    Je pense en fait que la méthode RegisterAsyncPostBackControl s'utilise couplée avec un UpdatePanel UpdateMode="Always".

    Merci.

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

Discussions similaires

  1. à quoi sert le controle pivotviewer ?
    Par glennog dans le forum Windows Phone
    Réponses: 1
    Dernier message: 23/04/2013, 10h05
  2. A quoi sert XML-Schema
    Par Community Management dans le forum Valider
    Réponses: 20
    Dernier message: 26/01/2009, 09h52
  3. a quoi sert le schema dans postgres ??
    Par champion dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 13/09/2004, 10h25
  4. [info] A quoi sert ImageObserver ?
    Par FrigoAcide dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 22/03/2004, 17h20

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