none
DDL et PostBack

    Question

  • Bonjour,

    sur une page (liste_r.aspx) j'ai une drop down list qui me permet de sélectionner la résidence à afficher mais une fois

    cette 

    résidence sélectionnée et affichée sur une autre page et si je fais un retour avec le navigateur, ma liste conserve la valeur

    de la résidence sélectionnée , alors que je souhaite tout réinitialiser sur cette page afin de faire d'autres sélection avec d'autres drop down liste.

    la DDL récupère la liste des résidences dans une SQLSOURCE.

      merci  de votre retour.

    mercredi 21 août 2013 10:11

Réponses

  • Premièrement excusez-moi pour les précédents message, mais j'ai confondu DDL et DLL  ... Cela m'arrive souvent.

    Après quelques essais dans Visual Studio, j'ai pu reproduire le problème et l'appréhender.

    1. Lorsque vous cliquez sur le retour de votre navigateur, la page n'appelle pas le Page_Load. La page est simplement reprise à partir du cache.
    2. J'ai essayé la désactivation du cache, je n'ai pas eu de résultat probant.

    Source du problème

    Je vais essayer d'expliquer clairement ce qui se passe après le retour de votre navigateur.

    Le premier évènement - celui de DDL résidences - est stocké. Un peu comme lorsque vous faites un retour sur votre navigateur après avoir soumis un formulaire. Celui-ci vous propose de soumettre une nouvelle fois le formulaire. Dans votre cas, l'évènement DDL résidences est encore là.

    Lorsque vous cliquez sur la deuxième DDL, l'évènement DDL résidences s'exécute de nouveau. Comme vous faites un Response.Redirect, ce dernier s'exécute. Mais si vous appelez Response.Redirect avec le deuxième paramètre à false, l'exécution continuerait et vous constateriez que le deuxième évènement s'exécute correctement. Malheureusement le Response.Redirect aura le dernier mot et vous arriverez sur une page non désirée. Si vous enlevez le response.redirect vous pourrez également le constater.

    Solutions

    Je vais maintenant vous proposer plusieurs solutions pour éviter le problème.

    1. Il ne faut pas faire le Response.Redirect dans l'évènement OnSelectedIndexChange de vos DDL. Il faut le faire à part. Vous pouvez le faire dans un Button ou dans un Hyperlink par exemple. Vos DDL auront différentes valeurs que vous pourrez consulter et ainsi accéder à la page désirée. Je pense que le mieux reste l'Hyperlink, cela parle plus aux utilisateurs. De plus vous gagneriez peut-être en clarté sur la page. Les utilisateurs n'aiment généralement pas les DropDownList qui les envoient immédiatement sur un autre contenu. Ils ont l'impression de ne pas contrôler leurs actions sur la page.
    2. Au lieu de chercher à vous rendre sur une autre page ASPX, vous pourriez rester sur la même page et afficher ou non le détail d'une résidence dans un Panel. Pour cela vous continueriez à utiliser les évènements de vos DDLs et vous afficheriez certaines sections de la page ASPX, préalablement cachées. Afin de ne pas recharger toute la page, je vous conseille d'utiliser des UpdatePanel.

     J'espère que cela vous aidera.

     



    mercredi 21 août 2013 19:11
  • Bonjour et désolé pour les retard des mes réponses.

    en fait j'ai contourné le problème on gardant mes DDL avec un response.redirect et OnselecteddindexChanged

    et redirigeant l’utilisateur vers une nouvelle page contenant la même DDL de cette façon pas besoin de revenir en arrière puisque le DDL est de nouveau présent sur la nouvelle page.

    en tout cas merci pour tout et à bientôt sur ce forum.

    cdt, 

       Alexis.

    mardi 27 août 2013 13:32

Toutes les réponses

  • Bonjour,

    sur la page liste_r.aspx, il faut réinitialiser le composant dropdownlist dans la méthode Page_Load.

    En regardant la documentation de la classe DropDownList, vous trouverez la méthode ClearSelection qui annule la sélection.

    En espérant vous avoir aidé.

    mercredi 21 août 2013 11:14
  • Merci de votre retour, mais j'ai déjà essayé cette méthode.

    je vais expliquer un peu mieux mon souci.

    en fait j'ai une page avec deux DDL lorsque je sélectionne sur la première DDL une résidence et puis je reviens en arrière avec le navigateur et si j'essaye d'utiliser ma 2ème DDL, cette dernière agit comme si j'ai activé la première DDL , en fait elle effectue la même action que la première alors que les deux DDL ont deux codes complètement différents et impossible dans page_load de remttre à clear la sélection des DDL.

    Espérant avoir était clair.

      merci de votre aide/


    mercredi 21 août 2013 12:14
  • J'avoue que j'ai du mal à visualiser ce que vous souhaitez faire, un bout du code aiderait certainement.

    si vous souhaitez avoir deux comportements différents il faut peut-être envisager une surcharge de la méthode avec des paramètres différents au lieu d'utiliser deux DLL.

    Vous pouvez également contrôler le namespace utiliser lors de l'appel, il peut y avoir une erreur à ce niveau là.

    mercredi 21 août 2013 12:28
  • Bonjour

    Le plus souvent l'explorateur va charger la page enregistrée dans son cache quand vous appuyez le back. 

    Donc je vous deux possibles solutions:

    1. bloquer le cache

    2. effacer la selection avec JavaScript - ici .

    Cordialement


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 21 août 2013 12:48
  • merci à tous les deux , mais j'ai peur que le mal soit plus profond.

    pour Aurel, j'ai ouvert un autre post pour un souci avec IE10 mais je crois que les deux sont liées.

    ci-dessous le code behind, mais je crois que j'ai un conflit entre les 2 DDL et le DATALIST.

    car quand je clique sur une commade de DATALIST c'est la DDL (région qui répond pas une erreur).

    le code  ( et merci bcp de votre aide).

    public partial class _Default : System.Web.UI.Page
    {

        Int32 IdRes;
        protected void Page_Load(object sender, EventArgs e)
        {
          
           if (!IsPostBack)
            {
             
            }// fin ispostback

        }  // fin pageload

        protected void Resultats_Moteur_Click(object sender, EventArgs e)
        {
            string typelot = lp_recherchelot_type_TypeLot.SelectedItem.Value;
            string fiscalite = lp_recherchelot_type_LoiFiscale.SelectedItem.Value;
            string prix = lp_recherchelot_type_Prix.SelectedItem.Value;
            string annee = lp_recherchelot_type_DateLivraisonAnnee.SelectedItem.Value;


            Response.Redirect("resultats_lots.aspx?typelot=" + typelot + "&fiscalite=" + fiscalite + "&prix=" + prix + "&annee=" + annee);

        }

        protected void Logout_Click(object sender, EventArgs e)
        {
            FormsAuthentication.SignOut();
            Response.Redirect("~/default.aspx");
        }
        protected void Logout_lppromotion_Click(object sender, EventArgs e)
        {
            FormsAuthentication.SignOut();
            Response.Redirect("http://www.XXX.com");
        }




        protected void detail_residence(object sender, EventArgs e)
        {  // drop down liste des programmes 
            
            String IdResid = Liste_Programmes_All.SelectedItem.Value;
            Response.Redirect("detail_res.aspx?IdRes=" + IdResid);
           
           
            //string LienRes = string.Format("detail_res.aspx?IdRes={0}", IdResid);
           //Response.Redirect(LienRes);

        }
        protected void detail_residence_region(object sender, EventArgs e)
        {  // drop down liste des régions 
            
            string IdRegion = Liste_region.SelectedItem.Value;
            string LienRegion = string.Format("ls_residences.aspx?region={0}", IdRegion);
            Response.Redirect(LienRegion);
        }
        
        protected void LinkToResidenceDetail(object source, DataListCommandEventArgs e)
        { // commande d'un DataList


            if ((e.CommandName == "CDetailResidence") || (e.CommandName == "CImageResidence"))
            {
                Label Lien = (Label)e.Item.FindControl("IdProjetLabel");
              
                string Reskey = Lien.Text.ToString();
                Response.Redirect("detail_res.aspx?IdRes=" + Reskey);

               
            }
        }

    }

    mercredi 21 août 2013 13:29
  • Je suppose que l'erreur se situe dans la méthode LinkToResidenceDetail ?

    En effet dans les autres méthodes, il n'y a que des accès aux éléments de la page ASPX et des redirection.

    Je suppose également que le problème vient de e.Item qui doit être le DataList et que c'est donc à ce niveau que les deux DLL interviennent ?

    Comment est codé le passage de l'argument DataListCommandEventArgs ? Et comment la distinction entre les deux DLL est-elle réalisée ?

    Pouvez-vous également nous fournir l'erreur remontée par votre région ?

    mercredi 21 août 2013 14:12
  • Merci, 
    En fait le DataList Tout seul marche très bien, et il y a pas vraiment d'erreur mais tout simplement souci de redirection, du moment ou je sélectionne dans la DDL1 une résidence et que je reviens en arrière tout est sauvegardé comme si c était la DDL qui controle tout, vraiment bizarre.

    ci-dessoues le code asp pour les 2 DLL et le DataList.

    <asp:DropDownList ID="Liste_Programmes_All" runat="server" DataSourceID="SqlDataSource3" DataTextField="NomResidence" DataValueField="IdProjet" class="form-search-type_lot" OnSelectedIndexChanged="detail_residence" AutoPostBack="true" AppendDataBoundItems="true">

    <asp:DropDownList ID="Liste_region" runat="server" DataSourceID="SqlDataSource5" DataTextField="NomRegion" DataValueField="IdRegion" class="form-search-type_lot" OnSelectedIndexChanged="detail_residence_region" AutoPostBack="true" AppendDataBoundItems="True">

    <asp:DataList ID="DataList1" runat="server" DataKeyField="IdProjet" DataSourceID="SqlDataSource6" OnItemCommand="LinkToResidenceDetail">

    mercredi 21 août 2013 15:11
  • Infos : 

    DataList et la DDL (régions) fonctionnent très bien ensemble , quand je fais retour arrière la DDL initialise toute seule.

    Le souci provient de la DDL ( résidences) , car au retour elle reste bloquée sur la valeur initiale sélectionnée.

    Merci 

    mercredi 21 août 2013 15:34
  • Premièrement excusez-moi pour les précédents message, mais j'ai confondu DDL et DLL  ... Cela m'arrive souvent.

    Après quelques essais dans Visual Studio, j'ai pu reproduire le problème et l'appréhender.

    1. Lorsque vous cliquez sur le retour de votre navigateur, la page n'appelle pas le Page_Load. La page est simplement reprise à partir du cache.
    2. J'ai essayé la désactivation du cache, je n'ai pas eu de résultat probant.

    Source du problème

    Je vais essayer d'expliquer clairement ce qui se passe après le retour de votre navigateur.

    Le premier évènement - celui de DDL résidences - est stocké. Un peu comme lorsque vous faites un retour sur votre navigateur après avoir soumis un formulaire. Celui-ci vous propose de soumettre une nouvelle fois le formulaire. Dans votre cas, l'évènement DDL résidences est encore là.

    Lorsque vous cliquez sur la deuxième DDL, l'évènement DDL résidences s'exécute de nouveau. Comme vous faites un Response.Redirect, ce dernier s'exécute. Mais si vous appelez Response.Redirect avec le deuxième paramètre à false, l'exécution continuerait et vous constateriez que le deuxième évènement s'exécute correctement. Malheureusement le Response.Redirect aura le dernier mot et vous arriverez sur une page non désirée. Si vous enlevez le response.redirect vous pourrez également le constater.

    Solutions

    Je vais maintenant vous proposer plusieurs solutions pour éviter le problème.

    1. Il ne faut pas faire le Response.Redirect dans l'évènement OnSelectedIndexChange de vos DDL. Il faut le faire à part. Vous pouvez le faire dans un Button ou dans un Hyperlink par exemple. Vos DDL auront différentes valeurs que vous pourrez consulter et ainsi accéder à la page désirée. Je pense que le mieux reste l'Hyperlink, cela parle plus aux utilisateurs. De plus vous gagneriez peut-être en clarté sur la page. Les utilisateurs n'aiment généralement pas les DropDownList qui les envoient immédiatement sur un autre contenu. Ils ont l'impression de ne pas contrôler leurs actions sur la page.
    2. Au lieu de chercher à vous rendre sur une autre page ASPX, vous pourriez rester sur la même page et afficher ou non le détail d'une résidence dans un Panel. Pour cela vous continueriez à utiliser les évènements de vos DDLs et vous afficheriez certaines sections de la page ASPX, préalablement cachées. Afin de ne pas recharger toute la page, je vous conseille d'utiliser des UpdatePanel.

     J'espère que cela vous aidera.

     



    mercredi 21 août 2013 19:11
  • Bonjour,

    Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ?

    Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?

    Désormais, nous marquons les solutions proposées.

    N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte.

    Merci !

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 27 août 2013 10:49
  • Bonjour et désolé pour les retard des mes réponses.

    en fait j'ai contourné le problème on gardant mes DDL avec un response.redirect et OnselecteddindexChanged

    et redirigeant l’utilisateur vers une nouvelle page contenant la même DDL de cette façon pas besoin de revenir en arrière puisque le DDL est de nouveau présent sur la nouvelle page.

    en tout cas merci pour tout et à bientôt sur ce forum.

    cdt, 

       Alexis.

    mardi 27 août 2013 13:32