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 :
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
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>
Ma variable de session n'est pas nulle.
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 page autorise bien les sessions :Et mon fichier de configuration web.config également :
Code : Sélectionner tout - Visualiser dans une fenêtre à part EnableSessionState="True"
Que faire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part <sessionState mode="InProc" timeout="60"></sessionState>
Merci d'avance.
jd
Partager