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 :

DropDownList perd la sélection après un postback. Pourquoi ? SessionParameter ?


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut DropDownList perd la sélection après un postback. Pourquoi ? SessionParameter ?
    Bonjour,

    je rencontre un problème sur mon site depuis que j'utilise une variable de session dans les méthodes Select, Insert et Delete d'un ObjectDataSource qui est utilisé comme source de données d'un DetailsView.

    Ce DétailsView contient 3 DropDownList qui sont cascadées et qui permettent d'ajouter un enregistrement dans un objet de ma couche métier.
    Le fonctionnement normal est le suivant :
    - La sélection dans la première liste (prestation) met à jour la seconde liste (type de prestation) et la troisième liste (famille de prestation).
    - La sélection dans la seconde liste met à jour la troisème liste.
    - L'appui sur le LinkButton 'Insérer' permet d'ajouter un enregistrement à l'aide de la méthode AjoutPrestation de la couche BLL.

    Depuis que j'ai ajouté le paramètre SessionParameter aux méthodes de l'ObjectDataSource prestationDataSource, j'ai un comportement différent :
    la sélection dans la première liste recharge toutes les données de ma page ! Je perds l'élément sélectionné !

    Voici un extrait du code de la 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
    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
    <%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="GestionFournisseur.aspx.cs" Inherits="XXX.BaseFournisseursWeb.GestionFournisseur" UICulture="fr" Culture="fr-FR" EnableSessionState="True" %>
    ...
                    <asp:ObjectDataSource ID="prestationDataSource" runat="server" 
                        SelectMethod="SelectionPrestations" OnSelected="OnError_Prestation" 
                        InsertMethod="AjoutPrestation" OnInserted="OnError_Prestation" 
                        DeleteMethod="SuppressionPrestation" OnDeleted="OnError_Prestation"
                        TypeName="XXX.BaseFournisseursBLL.ControleurBLL">
                        <DeleteParameters>
                            <asp:SessionParameter Name="fournisseur" SessionField="Fournisseur" Type="Object" />
                            <asp:Parameter Name="domaine" Type="String" />
                            <asp:Parameter Name="type" Type="String" />
                            <asp:Parameter Name="famille" Type="String" />
                        </DeleteParameters>
                        <SelectParameters>
                            <asp:SessionParameter Name="fournisseur" SessionField="Fournisseur" Type="Object" />
                        </SelectParameters>
                        <InsertParameters>
                            <asp:SessionParameter Name="fournisseur" SessionField="Fournisseur" Type="Object" />
                            <asp:Parameter Name="domaine" Type="String" />
                            <asp:Parameter Name="type" Type="String" />
                            <asp:Parameter Name="famille" Type="String" />
                        </InsertParameters>
                    </asp:ObjectDataSource> 
                    <asp:label id="lblPrestationDataSourceException" runat="server" ForeColor="Red" /> 
                    <asp:DetailsView ID="prestationDetailsView" runat="server" AutoGenerateRows="False" 
                        CssClass="detailstable" DataSourceID="prestationDataSource" DefaultMode="Insert"
                        OnItemInserting="prestationDetailsView_ItemInserting" Height="50px" Width="125px">
                        <Fields>
                            <asp:CommandField ShowInsertButton="True" />
                            <asp:TemplateField HeaderText="Domaine" SortExpression="Domaine">
                                <InsertItemTemplate>
                                    <asp:DropDownList ID="ddlDomainePrestation" runat="server" AutoPostBack="true"
                                        DataSourceID="domainePrestationDataSource" SelectedValue='<%# Bind("Domaine") %>'>
                                    </asp:DropDownList>
                                    <asp:ObjectDataSource ID="domainePrestationDataSource" runat="server" 
                                        SelectMethod="SelectionListeDomainesPrestation"                    
                                        TypeName="XXX.BaseFournisseursBLL.ControleurBLL"> 
                                    </asp:ObjectDataSource> 
                                </InsertItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Type" SortExpression="Type">                        
                                <InsertItemTemplate>                                                              
                                    <%--JDH : pas de 2-way binding pour les DropDownList cascadée
                                    Cf. http://msdn.microsoft.com/fr-fr/library/bb469855.aspx
                                    --%>
    		<asp:DropDownList ID="ddlTypePrestation" runat="server" AutoPostBack="true"
                                        DataSourceID="typePrestationDataSource">
                                    </asp:DropDownList>
                                    <asp:ObjectDataSource ID="typePrestationDataSource" runat="server" 
                                        SelectMethod="SelectionListeTypesPrestation"                    
                                        TypeName="XXX.BaseFournisseursBLL.ControleurBLL">                                   
                                        <SelectParameters>
                                            <asp:ControlParameter ControlID="ddlDomainePrestation" Name="xDomaine" PropertyName="SelectedValue" Type="String" />
                                        </SelectParameters>
                                    </asp:ObjectDataSource>
                                </InsertItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Famille" SortExpression="Famille">
                                <InsertItemTemplate>
                                    <%--JDH : pas de 2-way binding pour les DropDownList cascadée
                                    Cf. http://msdn.microsoft.com/fr-fr/library/bb469855.aspx
                                    --%>
    		<asp:DropDownList ID="ddlFamillePrestation" runat="server" AutoPostBack="false"
                                        DataSourceID="famillePrestationDataSource">
                                    </asp:DropDownList>
                                    <asp:ObjectDataSource ID="famillePrestationDataSource" runat="server" 
                                        SelectMethod="SelectionListeFamillesPrestation"                    
                                        TypeName="XXX.BaseFournisseursBLL.ControleurBLL"> 
                                        <SelectParameters>
                                            <asp:ControlParameter ControlID="ddlDomainePrestation" Name="xDomaine" PropertyName="SelectedValue" Type="String" />
                                            <asp:ControlParameter ControlID="ddlTypePrestation" Name="xType" PropertyName="SelectedValue" Type="String" />
                                        </SelectParameters>
                                    </asp:ObjectDataSource>
                                </InsertItemTemplate>
                            </asp:TemplateField>
                        </Fields>
                    </asp:DetailsView>
    Le code-behind de la 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    //récupération du paramètre - code fournisseur
                    if (!String.IsNullOrEmpty(Request.QueryString["xCode"]))
                    {
                        //récupération de toutes les données du fornisseur POUR CETTE SESSION
                        //ajout de la variable de session 'Fournisseur' pour gestion du multi-utilisateurs. 
                        //Toutes les classes internes à la classe Fournisseur sont définies [Serializable] !
                        Session.Add("Fournisseur", Global.GetControlerBLL().GetFournisseur(Request.QueryString["xCode"]));
    	    ....
     
            protected void prestationDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
            {
                if (Page.IsValid)
                {
                    //JDH : bug microsoft. Cf. http://msdn.microsoft.com/fr-fr/library/bb469855.aspx
     
                    //Retrouver le contrôle DetailsView.
                    //C'est lui qui a déclenché l'évènement ItemInserting.
                    //Retrouver le contrôle de la liste déroulante des domaines
                    //Il est encapsulé dans le modèle InsertItemTemplate de la vue
                    //Mettre à jour le buffer des données à insérer dans la source de données
                    //Utiliser le paramètre de l'évènement qui contient une collection des valeurs de l'enregistrement.
     
                    //JDH : équivalent codé au 2-way binding : SelectedValue='<%# Bind("Type") %>'
                    e.Values["Type"] = ((DropDownList)((DetailsView)sender).FindControl("ddlTypePrestation")).SelectedValue;
                    //JDH : équivalent codé au 2-way binding : SelectedValue='<%# Bind("Famille") %>'
                    e.Values["Famille"] = ((DropDownList)((DetailsView)sender).FindControl("ddlFamillePrestation")).SelectedValue;
     
                    //Poursuivre l'action d'insertion normalement
                    e.Cancel = false;
                }
            }
    Ma variable de session n'est pas nulle.
    Ma page autorise bien les sessions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnableSessionState="True"
    Et mon fichier de configuration web.config également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <sessionState mode="InProc" timeout="60"></sessionState>
    Que faire ?
    Merci d'avance.
    jd

  2. #2
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Est-ce que tu as créé la base de données de sessions dans ton serveur sql?

    L'utilisation des variables de session se justifie quand on veut conserver des données pendant toute la navigation d'un internaute. Est-ce le cas?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    Salut,

    je n'ai rien paramétré au niveau du serveur SQL.
    Est-ce qu'il faut faire quelque chose si le mode de session est défini à 'InProc' ?
    Par contre, la variable de session fonctionne bien, elle me retourne le bon objet. Mais, elle a visiblement un effet sur le binding de l'objet prestationDataSource.
    Lorsque j'utilise exactement le même code avec les méthode Select, Insert et Delete de l'objet prestationDataSource sans SessionParameter, ça fonctionne correctement !

    Et pour répondre à ta seconde question, je veux effectivement conserver l'objet 'fournisseur' sur toute la durée de la session utilisateur.

    Merci pour ton temps.

  4. #4
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par herr_jd Voir le message
    je n'ai rien paramétré au niveau du serveur SQL.
    Est-ce qu'il faut faire quelque chose si le mode de session est défini à 'InProc' ?
    Argh, je m'ai trompé. Désolé. InProc signifie dans le processus IIS.

    Attend, je réfléchis...
    "Winter is coming" (ma nouvelle page d'accueil)

  5. #5
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    Petite précision sur l'ancien et le nouveau comportement.
    L'ordre d'appel des méthodes des objets ObjectDataSource montre bien le dysfonctionnement :

    Chargement de la page sans et avec SessionParameter :
    1. SelectionPrestation
    2. SelectionListeDomainesPrestation
    3. SelectionListeTypesPrestation
    4. SelectionListeFamillesPrestation

    Après sélection d'un domaine dans la DropDownList 'ddlDomainePrestation' sans SessionParameter :
    1. SelectionListeTypesPrestation
    2. SelectionListeFamillesPrestation

    Après sélection d'un domaine dans la DropDownList 'ddlDomainePrestation' avec SessionParameter :
    1. SelectionPrestation
    2. SelectionListeDomainesPrestation
    3. SelectionListeTypesPrestation
    4. SelectionListeFamillesPrestation

    Voilà, j'espère que c'est plus clair. Merci.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    J'ai réalisé un autre test en remplaçant le paramètre de session 'SessionParameter' par un paramètre de type 'QueryStringParameter' et le fonctionnement est correct.
    L'ordre d'appel des méthodes après sélection d'un domaine dans la DropDownList 'ddlDomainePrestation' est le suivant :

    1. SelectionListeTypesPrestation
    2. SelectionListeFamillesPrestation

    Est-ce que quelqu'un à une idée pourquoi l'objet prestationDataSource réalise en fait un second postback lorsque j'utilise un paramètre de Session ?

  7. #7
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    PVI, j'ai résolu mon problème.
    Je n'utilise plus de SessionParameter au niveau de mon controle ObjectDataSource, j'utilise une variable de session pour récupérer mon objet Fournisseur dans ma couche BLL à l'aide de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HttpContext.Current.Session["Fournisseur"]

  8. #8
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Ce n'est paut-être pas le cas si tu passes juste la valeur, mais HttpContext ne devrait pas apparaître dans une BLL.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

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

Discussions similaires

  1. [Débutant] Pourquoi ma liste se vide après un postback ?
    Par nath-0-0 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 09/05/2012, 21h37
  2. Réponses: 2
    Dernier message: 14/09/2006, 12h04
  3. Réponses: 3
    Dernier message: 22/08/2006, 15h38
  4. [vb.net] probleme de datasource perdu apres le postback
    Par graphicsxp dans le forum ASP.NET
    Réponses: 12
    Dernier message: 03/03/2006, 16h29
  5. Réponses: 5
    Dernier message: 16/02/2006, 16h27

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