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 :

[C#2.0] DropDownList - La valeur n'est pas reconnue par .NET


Sujet :

ASP.NET

  1. #1
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut [C#2.0] DropDownList - La valeur n'est pas reconnue par .NET
    Salut

    Je cherche pour quelle raison un DropDownList ne me renverrait pas la valeur sélectionnée pendant un PostBack.

    Mais tout d'abbord, mise en situation

    J'ai un DropDownList peuplé avec une liste d'activités (ddl_activite), et une autre, peuplée par une liste d'indicateurs dépendant de l'activité sélectionnée (ddl_indicateur).

    ddl_indicateur est peuplé dynamiquement par du Javascript en fonction de ce qui a été sélectionné dans ddl_activite (la page dérive de ICallBackEventHandler, et c'est le GetCallbackResult qui s'occupe de générer le javascript qui va peupler ddl_indicateur)

    Dans GetCallbackResult j'ai bien mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClientScript.RegisterForEventValidation(ddl_indicateur.UniqueID, cur_row["INDICATEUR_ID"].ToString());
    où cur_row est un DataRow contenant la liste des indicateurs valides pour l'activité sélectionnée (et bien entendu, cur_row["INDICATEUR_ID"] est la valeur de l'option affichée)

    Tout fonctionne bien, sauf que quand je valide mon formulaire, j'ai ddl_indicateur.SelectedValue == "170" alors que j'ai Request.Form["ddl_indicateur"] == "129"

    J'ai vérifié, je ne réinitialise pas mon ddl_indicateur dans le Page_Load (comme je faisait beaucoup en démarrant en .NET) vu que l'initialisation générale est protégée par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!IsPostBack)
        load();
    (sachant que j'appelle toujours load() ma fonction d'initialisation de la page, je sais c'est pas super, mais j'ai pris l'habitude maintenant )

    J'ai vérifié au debugger, mon ddl_indicateur_SelectedIndexChanged est bien appelé avant mon btn_valider_Click (sachant que ddl_indicateur_SelectedIndexChanged est vide, c'était juste pour vérifier que cet événement était appelé avant le traitement du bouton)

    Est ce que cette dernière phrase me permet d'affirmer que la valeur "censée être" sélectionnée dans le ddl_indicateur est bien la valeur que j'ai d'affichée dans mon navigateur ? (Je veut dire, .NET a terminé le changement de valeur du ddl_indicateur). Je dis ca, parce que j'ai lu je ne sais plus où que l'ordre dans lequel sont appelés les événements n'est pas certain, donc j'ai controlé avec les moyens du bord.

    Aurais-je oublié quelque chose ? (La question est bête car oui, j'ai manifestement oublié quelque chose )

    PS : Veuillez prendre conscience que tout ce post est écrit dans un langage que je ne pratique pas en ce moment derrière mon écran... (Ce dernier ressemblant plus à
    ù*$ù*ù de DropDownList de ù*$ù*!:!**$* !!! pourquoi ta ^ù*$^m: de valeur est pas la bonne ù$$*ù: de $ù:ù*
    avec la censure adéquate

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    la comme ca je peux pas te donner de detail. mais quand un control est peuplé par du javascript je sais que ca peux mettre asp .net dans les choux j'ai deja vu ce genre de post pas mal de fois.

    Je crois que la seul solution c'est de le recup en Request.Form[].

    A confirmer

  3. #3
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    Pfffff, y a des gens qui se font chier pour qu'on puisse coder sans utiliser les formulaires, et là, je trouve pas d'autre solution qu'aller chercher la variable qu'il y a dans un Request.Form... Tant pis, ca restera comme ca, jusqu'à ce que je trouve le pourquoi du comment

  4. #4
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut
    Si possible donne nous ton code car cela me semble bizarre ton histoire.
    Pour ma part, à part la valeur NULL (question d'initialisation) il ne peut t'envoyer une valeur existante différente de celle choisie dans la COMBOBOX

    Mow

  5. #5
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    Voilà ma fonction exécutée en CallBack

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    #region ICallbackEventHandler Membres
     
    string ICallbackEventHandler.GetCallbackResult()
    {
        string retour = string.Empty;
     
        switch (f.getVar(callBackArgs, "action"))
        {
            case "activite":
                retour = fillActivite(callBackArgs);
                break;
            default:
                retour = fillIndicateur(callBackArgs);
                break;
        }
     
     
        return retour;
    }
     
    private string fillIndicateur(string callBackArgs)
    {
        string retour = string.Empty;
     
        int indicateur_id = Convert.ToInt32(f.getVar(callBackArgs, "indicateur_id"));
        int activite_id = Convert.ToInt32(f.getVar(callBackArgs, "activite_id"));
     
        DataTable tbl_details = PlanAction.GetDetails(Session["entite_id"].ToString(), Convert.ToInt32(Session["entite_type_id"]), activite_id);
     
        string param = "MM=" + f.getVar(callBackArgs, "MM") + "&CLIENT=" + f.getVar(callBackArgs, "CLIENT") + "&TYPE=" + f.getVar(callBackArgs, "TYPE");
     
        DataRow[] cur_rows = tbl_details.Select("INDICATEUR_ID = " + indicateur_id.ToString() + " AND INDICATEUR_PARAMETRES = '" + param + "'");
     
        foreach (DataRow cur_row in cur_rows)
        {
            string valIni;
            string valCible;
            string dateCible;
            string commentaire;
     
            if (cur_row["DETAIL_VAL_INI"] != DBNull.Value)
                valIni = Math.Round(Convert.ToDouble(cur_row["DETAIL_VAL_INI"]), 2).ToString();
            else
                valIni = string.Empty;
     
            if (cur_row["DETAIL_CIBLE"] != DBNull.Value)
                valCible = Math.Round(Convert.ToDouble(cur_row["DETAIL_CIBLE"]), 2).ToString();
            else
                valCible = string.Empty;
     
            if (cur_row["DETAIL_DATE_FIN"] != DBNull.Value)
            {
                DateTime dateCourante = Convert.ToDateTime(cur_row["DETAIL_DATE_FIN"]);
                dateCible = dateCourante.Month + "/" + dateCourante.Year;
            }
            else
                dateCible = string.Empty;
     
            if (cur_row["DETAIL_COMMENTAIRE"] != DBNull.Value)
                commentaire = cur_row["DETAIL_COMMENTAIRE"].ToString();
            else
                commentaire = string.Empty;
     
            retour = "$('" + txb_valIni.ClientID + "').value = '" + valIni + "';";
            retour += "$('" + txb_cible.ClientID + "').value = '" + valCible + "';";
            retour += "$('" + txb_dateCible.ClientID + "').value = '" + dateCible + "';";
            retour += "$('" + txb_commentaire.ClientID + "').value = '" + commentaire.Replace("'", "\\'") + "';";
        }
     
        if (retour == string.Empty)
        {
            retour = "$('" + txb_valIni.ClientID + "').value = '';";
            retour += "$('" + txb_cible.ClientID + "').value = '';";
            retour += "$('" + txb_dateCible.ClientID + "').value = '';";
            retour += "$('" + txb_commentaire.ClientID + "').value = '';";
        }
     
        return retour;
    }
     
    private string fillActivite(string callBackArgs)
    {
        int activite_id = Convert.ToInt32(f.getVar(callBackArgs, "activite_id"));
     
        DataTable tbl_indicateurs = PlanAction.IndicateursList(PlanAction.FacID(activite_id));
     
        ddl_indicateur.Items.Clear();
     
        string retour = "var ddl = $('" + ddl_indicateur.ClientID + "');\n" +
                        "var test = 0;\n" +
                        "for (j = 0; ddl.options.length > 0; ++j)\n" +
                        "    ddl.options[0] = null;\n";
     
        int? selectedOption = null;
     
        foreach (DataRow cur_row in tbl_indicateurs.Rows)
        {
            retour += "o = new Option('" + cur_row["INDICATEUR_DESCRIPTION"].ToString().Replace("'", "\\'") + "', '" + cur_row["INDICATEUR_ID"].ToString() + "');\n" +
                      "ddl.options[ddl.options.length] = o;\n";
     
            ddl_indicateur.Items.Add(new ListItem(cur_row["INDICATEUR_DESCRIPTION"].ToString(), cur_row["INDICATEUR_ID"].ToString()));
     
            ClientScript.RegisterForEventValidation(ddl_indicateur.UniqueID, cur_row["INDICATEUR_ID"].ToString());
     
            if (selectedOption == null)
                selectedOption = Convert.ToInt32(cur_row["INDICATEUR_ID"]);
        }
     
        if (selectedOption != null)
        {
            string param = "MM=" + f.getVar(callBackArgs, "MM") + "&CLIENT=" + f.getVar(callBackArgs, "CLIENT") + "&TYPE=" + f.getVar(callBackArgs, "TYPE");
     
            retour += fillIndicateur("indicateur_id=" + selectedOption.ToString() + "&activite_id=" + activite_id.ToString() + "&" + param);
        }
        if (activite_id == PlanAction.ActiviteID("Véhicule Neuf") || activite_id == PlanAction.ActiviteID("Distribution"))
            retour += ";$('" + pan_options.ClientID + "').style.display = 'block';";
        else
            retour += ";$('" + pan_options.ClientID + "').style.display = 'none';" +
                      "$('" + ddl_marque.ClientID + "').selectedIndex = 0;" +
                      "$('" + ddl_type.ClientID + "').selectedIndex = 0;";
     
        return retour;
    }
     
    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {
        callBackArgs = eventArgument;
    }
     
    #endregion
    Ici, les 2 fonctions javascript qui sont appellées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string js_onChangeActivite = ClientScript.GetCallbackEventReference(this, "'action=activite&activite_id=' + $('" + ddl_activite.ClientID + "').options[$('" + ddl_activite.ClientID + "').selectedIndex].value + " +
                                                                              "'&' + $('" + ddl_type.ClientID + "').options[$('" + ddl_type.ClientID + "').selectedIndex].value + " +
                                                                              "'&' + $('" + ddl_marque.ClientID + "').options[$('" + ddl_marque.ClientID + "').selectedIndex].value", "t", "c", "e", false) + ";";
     
    string js_onChangeIndicateur = ClientScript.GetCallbackEventReference(this, "'action=indicateur&activite_id=' + $('" + ddl_activite.ClientID + "').options[$('" + ddl_activite.ClientID + "').selectedIndex].value + '&indicateur_id=' + this.options[this.selectedIndex].value", "t", "c", "e", false) + ";";
    Pour info tout de même , f.getVar() est une fonction qui me permet de récupérer des données de la même manière que dans un querystring (c'est à dire que si je fais f.getVar("foo=123&bar=456", "foo") j'obtiens "123")
    Je sais le code est dégueulasse, mais à l'époque où j'ai fais cette fonction (c'est à dire il y a un peu plus d'un an maintenant) je ne connaissait que dalle à .NET, je travaillais dans l'urgence, et je faisait beaucoup de code dégueu...
    Du coup, vu que j'ai pas le temps de recoder mon vieux code, j'ai encore des vestiges pas beau

    Oh, dernière chose... Mon Page_Load()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            load();
    }
    qui comme vous pouvez le voir, ne fais rien dans le cas d'un PostBack

    et mes fonctions javascript
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var c;
     
    function t(resultat, context)
    {
        eval(resultat);
    }
     
    function e(resultat, context)
    {
        alert(resultat);
    }

  6. #6
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Une question bete pourquoi tu le fais en javascript et pas en asp.net pur???

    C'est à dire avec un autopostback sur la première ddl pour charger la seconde et après un bouton pour valider l'ensemble de la sélection.

    Ce n'est qu'une question, je ne sais pas exactement le but final de ce que tu souhaites faire

  7. #7
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    Le but c'est de sélectionner des indicateurs dans une base,e t je voudrais éviter le plus possible les postback, car en Espagne il semblerait que l'affichage des pages soit long (alors qu'en Callback, ils auraient moins de problème). Etant donné que l'application est à caractère internationale et que tout le monde n'a pas une connexion ADSL dans la boite pour laquelle je bosse, j'essaie de réduire au maximum le nombre de hit sur des gros fichiers.

    PS : J'ai déja activé la compression des pages ASPX, ASMX, JS, CSS et consort dans IIS

  8. #8
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Dans ce cas là pourquoi n'utiliserais tu pas AJAX à moins que tu ne l'utilise déjà !!!

  9. #9
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    Citation Envoyé par tortuegenie Voir le message
    Dans ce cas là pourquoi n'utiliserais tu pas AJAX à moins que tu ne l'utilise déjà !!!
    Les CallBack d'ASP.Net ce sont des procédures AJAX toutes faites

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/06/2012, 10h34
  2. javax.servlet n'est pas reconnu par Eclipse
    Par sisiniya dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 07/06/2009, 19h09
  3. [XSLT] tester que la valeur n'est pas
    Par DrDam dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 15/05/2008, 09h24
  4. le caractère '_' n'est pas reconnu par le langage SQL
    Par zainab2000 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/03/2007, 20h42
  5. innerText n'est pas reconnue par FireFox !
    Par faico dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/08/2006, 21h51

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