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:
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:
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:
EnableSessionState="True"
Et mon fichier de configuration web.config également :
Code:
<sessionState mode="InProc" timeout="60"></sessionState>
Que faire ?
Merci d'avance.
jd