none
Page_Load activé sur Combo AjaxControlToolKit dans page avec code behind RRS feed

  • Question

  • Bonjour,

    Lorsque je place des contrôles AjaxControlToolKit, par exemple un Combo sur une page avec code behind, j'ai systématiquement un retour vers le serveur, alors que lorsque je place le même Combo sur une page incluant le script, cela fonctionne parfaitement seule le gestionnaire d'évènement associé est actif sans passage par le Page_Load !

    Il est probable que j'ai du oublier quelque chose, mais quoi ?

    Une petite suggestion serait la bienvenue !

    Merci d'avance.

    vendredi 11 janvier 2013 22:01

Réponses

  • Salut.

    J'ai essayé ton code, et il n'y a pas de problème pour moi : je suis bien en rafraichissement partiel.

    Est-tu certain d'avoir un refresh complet de ta page ? As-tu vérifié dans le contenu de la réponse ? Si dans le contenu de la réponse tu as :

    1|#||4|1068|updatePanel|UpdatePanel1|....

    c'est que tu es en mode Ajax avec refresh partiel de ta page.

    A noter que j'ai la version 4.1.60919.0 de l'AjaxControlToolkit.

    Cordialement.


    Merci de tagger "Proposer comme réponse" et/ou "Utile" si un post répond à votre demande.

    dimanche 13 janvier 2013 16:07
  • Effectivement j'ai bien :
    1|#||4|1152|updatePanel|UpdatePanel1| . . .
    alors que pour une page "normale" j'ai :
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 . . .

    Au passage, merci pour l'info, je n'utilisais Firebug que pour le débogage du Javascript !

    Donc effectivement seule une partie de la page fait l'aller-retour, mais pour autant même si seuls les composants du UpdatePanel sont actualisés, le code côté serveur est bien exécuté, ce qui en termes de performances, n'est pas vraiment génial (je fais beaucoup d'accès à la base de données) et pas de chance, mais c'est surtout cela que je pensais éviter :-(
    Y aurait-il un moyen d'éviter l'appel sinon au Page_load du moins aux appels des méthodes contenus (ce sont les appels qui sont contenus) dans le Page_Load en testant par exemple une valeur issue du REQUEST ?

    J'ai par exemple un tableau qui est rechargé à chaque Page_Load et ce que l'on soit en PostBack ou non.

    J'ai bien une solution alternative qui serait d'appeler une popup qui ne fera que le travail demandé, mais du coup, je perds la productivité induite par AjaxControlToolKit !

    Merci pour ton aide.


    dimanche 13 janvier 2013 21:18

Toutes les réponses

  • Bonjour,

    je n'ai pas tout compris :

    - "j'ai systèmatiquement un retour vers le serveur" : tu as un postback lorsque tu sélectionne un item dans la liste ?

    - "une page incluant le script" : tu parle du ScriptManager ?

    - "seul le gestionnaire d'événement associé est actif sans passage par Page_Load" : ????

    En tout cas, il est normal de devoir mettre le ScriptManager lorsque tu utilise les composants de AjaxControlToolkit : ces composants sont fait pour être utilisés en Ajax.

    N'oublie pas non plus de vérifier que tu n'as pas des AutoPostBack qui trainent et qui ne sont pas nécessaires.

    Cordialement.


    Merci de tagger "Proposer comme réponse" et/ou "Utile" si un post répond à votre demande.

    samedi 12 janvier 2013 08:31
  • Bonjour,

    Tout d'abord merci d'avoir répondu.

    En fait je viens de m'apercevoir qu'aucun des deux codes ne fonctionnait, les deux effectuent un postback complet, donc renvoient la page au lieu d'un sous-ensemble et donc à chaque fois passent par le page_load.

    Voici les deux pages :

    Default2.aspx :

    <%@ Page Language="C#" %>
    <%@ Register Assembly="AjaxControlToolkit, Version=4.1.60623.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"
        Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">
        void Page_Load()
        {
            if (!IsPostBack)
            {
                Label1.Text = "Hello";

            }
        }
        protected void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Label1.Text = ComboBox1.SelectedValue;
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
        </ajaxToolkit:ToolkitScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                <br />
                <ajaxToolkit:ComboBox ID="ComboBox1" runat="server" DropDownStyle="DropDownList"
                     OnSelectedIndexChanged="ComboBox1_SelectedIndexChanged"
                    AutoPostBack="True">
                    <asp:ListItem>Choix1</asp:ListItem>
                    <asp:ListItem>Choix2</asp:ListItem>
                    <asp:ListItem>Choix3</asp:ListItem>
                </ajaxToolkit:ComboBox>
            </ContentTemplate>
        </asp:UpdatePanel>
        </form>
    </body>
    </html>

    Default.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

    <%@ Register Assembly="AjaxControlToolkit, Version=4.1.60623.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"
        Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnablePartialRendering="true">
        </ajaxToolkit:ToolkitScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                <br />
                <ajaxToolkit:ComboBox ID="ComboBox1" runat="server" DropDownStyle="DropDownList"
                     OnSelectedIndexChanged="ComboBox1_SelectedIndexChanged"
                    AutoPostBack="True">
                    <asp:ListItem>Choix1</asp:ListItem>
                    <asp:ListItem>Choix2</asp:ListItem>
                    <asp:ListItem>Choix3</asp:ListItem>
                </ajaxToolkit:ComboBox>
            </ContentTemplate>
        </asp:UpdatePanel>
        </form>
    </body>
    </html>

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using AjaxControlToolkit;

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Label1.Text = "Hello";
            }
        }
        protected void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Label1.Text = ComboBox1.SelectedValue;
        }
    }

    samedi 12 janvier 2013 10:34
  • Salut.

    J'ai essayé ton code, et il n'y a pas de problème pour moi : je suis bien en rafraichissement partiel.

    Est-tu certain d'avoir un refresh complet de ta page ? As-tu vérifié dans le contenu de la réponse ? Si dans le contenu de la réponse tu as :

    1|#||4|1068|updatePanel|UpdatePanel1|....

    c'est que tu es en mode Ajax avec refresh partiel de ta page.

    A noter que j'ai la version 4.1.60919.0 de l'AjaxControlToolkit.

    Cordialement.


    Merci de tagger "Proposer comme réponse" et/ou "Utile" si un post répond à votre demande.

    dimanche 13 janvier 2013 16:07
  • Bonjour,

    Merci d'avoir répondu.

    Où et comment dois-je récupérer le contenu de la réponse ?

    Evidemment le code fourni n'est qu'un exemple, mais si le passe systématiquement par le Page_Load, alors tout le code contenu dedans va s'exécuter, ors cela ne m'est d'aucune utilité.

    Donc je voudrais savoir si toi aussi tu passes par le Page_Load ?

    Merci,

    Alain

    dimanche 13 janvier 2013 17:50
  • Sous Firefox, tu peux utiliser Firebug pour cela : dans l'onglet "Réseau" tu as tous les échanges réseau entre le navigateur et le serveur Web. Tu peux y analyser les requêtes passées et le contenu des réponses, y compris les entêtes HTTP.

    Il faut que tu te familiarise avec le cycle de vie des pages car le Page_Load est toujours appelé, même lors de la réponse à des évenements "click", "change", etc.

    En définitive, ce n'est pas parce que la requête passe par le Page_Load que tu n'as pas un refresh partiel de ta page dans le navigateur.

    Cordialement.


    Merci de tagger "Proposer comme réponse" et/ou "Utile" si un post répond à votre demande.

    • Proposé comme réponse Hervé DORIER dimanche 13 janvier 2013 20:02
    dimanche 13 janvier 2013 20:01
  • Effectivement j'ai bien :
    1|#||4|1152|updatePanel|UpdatePanel1| . . .
    alors que pour une page "normale" j'ai :
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 . . .

    Au passage, merci pour l'info, je n'utilisais Firebug que pour le débogage du Javascript !

    Donc effectivement seule une partie de la page fait l'aller-retour, mais pour autant même si seuls les composants du UpdatePanel sont actualisés, le code côté serveur est bien exécuté, ce qui en termes de performances, n'est pas vraiment génial (je fais beaucoup d'accès à la base de données) et pas de chance, mais c'est surtout cela que je pensais éviter :-(
    Y aurait-il un moyen d'éviter l'appel sinon au Page_load du moins aux appels des méthodes contenus (ce sont les appels qui sont contenus) dans le Page_Load en testant par exemple une valeur issue du REQUEST ?

    J'ai par exemple un tableau qui est rechargé à chaque Page_Load et ce que l'on soit en PostBack ou non.

    J'ai bien une solution alternative qui serait d'appeler une popup qui ne fera que le travail demandé, mais du coup, je perds la productivité induite par AjaxControlToolKit !

    Merci pour ton aide.


    dimanche 13 janvier 2013 21:18
  • Tu aura beau faire ce que tu veux, tu passeras toujours par Page_Load : cet événement de ne veut pas dire "Premier chargement de la page".

    Il faut que tu mette le code d'initialisation de ton tableau dans la partie "!IsPostBack" :

    protected void Page_Load(object sender, EventArgs e)
        {
            //Code à faire toujours
            ... vérification des droits utilisateur par ex.
            if (!IsPostBack)
            {
                //Code à exécuter uniquement lors d'un événement utilisateur
                ..... 
            } else {
                .... initialisation des données dans la page
            }
        }
    Ton tableau est bien en dehors de ton UpdatePanel ?


    Merci de tagger "Proposer comme réponse" et/ou "Utile" si un post répond à votre demande.

    lundi 14 janvier 2013 08:50
  • Oui je connais le Page_Load et son fonctionnement (10 ans d'asp.net), je n'avais tout simplement pas d'expérience sur Ajax autre que sous PHP. Et non pas dans !IsPostback, le chargement du tableau doit bien se faire à chaque Page_Load car par ailleurs, il y a plusieurs pages qui peuvent activer cette page et même un javascript qui ne se comporte pas comme un submit.

    Pour le moment le seul endroit que j'ai trouvé pour tester s'il s'agit d'un retour  d'un UpdatePanel, c'est le Request.InputStream, mais cela me paraît un peu lourd à manipuler, j'essaye de trouver un équivalent à Postback.

    lundi 14 janvier 2013 16:42
  • Bonjour,

    Je pense avoir trouvé quelque chose qui corresponde à ce que je cherche, à savoir faire exécuter côté serveur des actions qui vont permettre d'actualiser un sous-ensemble d'une page, sans pour autant réactiver le Page_Load de cette page.

    Voici l'exemple : http://msdn.microsoft.com/fr-fr/library/ms178210.aspx

    Il reste cependant un problème à résoudre, il faudrait que le bouton btnRefresh de la page MaPage.aspx lance une action sur RefreshPage.aspx pour ensuite en récupérer le résultat et enfin l'affecter au sous-ensemble à rafraichir.

    Et ça c'est pas gagné, j'ai même l'impression que ce n'est pas possible.

    Qu'en penses-tu ?

    J'ai bien une alternative (autre que les Web Services), c'est d'appeler à l'aide de JavaScript une classique page aspx qui fera le travail demandé d'en récupérer le résultat et à l'aide de window.openner affecter la valeur récupérée à la page d'origine. C'est même comme cela que je procède depuis plusieurs années, avec l'inconvénient de la programmation JavaScript qui est souvent fastidieuse et parfois assez aléatoire ;-)

    mardi 15 janvier 2013 17:30
  • Sympa ce truc, je ne connaissais pas ... pour cela, j'utilise plutôt des Webservices. Après la difficulté est d'intégré le résultat en JavaScript dans la page.

    Je ne comprends pas pourquoi tu veux appeler "RefreshPage.aspx".

    Avec le lien que tu as mis dans ton post, il "suffit" que la méthode GetCallBackResult retourne un fragment de HTML, non ?


    Merci de tagger "Proposer comme réponse" et/ou "Utile" si un post répond à votre demande.

    mardi 15 janvier 2013 19:10