Bonjour,
J'ai un petit soucis avec un site Web que je développe : il ne se comporte pas de la même façon en local sur mon poste avec Visual Studio (serveur Web Cassini si je me trompe pas) et sur le serveur de recette (serveur Web IIS).
Dans la page qui pose problème, j'utilise des composants de ComponentArt (treeview, menu contextuel & callback).
Avec Cassini :
* Il fait une première fois le PageLoad
* Il exécute la méthode EffectuerAction_Callback et met des infos en Session
* Il exécute une seconde fois le PageLoad (et en fonction des informations mises en Session dans la méthode en CallBack, il y a une redirection vers une autre page)
Avec IIS :
* Il fait une première fois le PageLoad
* Il fait une seconde fois le PageLoad
* Il exécute la méthode EffectuerAction_Callback et met des infos en Session
Après le callback, je souhaite que la page soit rechargée.
Voici quelques extraits de mon code :
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 <%@ Page Language="C#" AutoEventWireup="False" MasterPageFile="~/LocalMasterPage.master" CodeBehind="Structures.aspx.cs" Inherits="Sncf.IHMSumatra.Web.Structures" %> <%@ Register Assembly="ComponentArt.Web.UI" Namespace="ComponentArt.Web.UI" TagPrefix="CA" %> <%@ OutputCache Location="None" %> <asp:Content ID="ContentScript" ContentPlaceHolderID="ContentPlaceHolderScriptZone" runat="server"> <script type="text/javascript"> function t1_onContextMenu(sender, eventArgs) { /* On met en évidence le noeud sur lequel on a cliqué */ eventArgs.get_node().select(); /* on recupere le niveau du noeud pour afficher le bon menu */ switch (eventArgs.get_node().get_id().split('_')[0]) { case '0': /* la racine */ ex_menu1.showContextMenuAtEvent(eventArgs.get_event(), eventArgs.get_node()); break; default: ex_menu2.showContextMenuAtEvent(eventArgs.get_event(), eventArgs.get_node()); break; } } function Menu_onItemSelect(sender, eventArgs) { /* Correspond à l'action du menu contextuel */ var menuItem = eventArgs.get_item(); /* Correspond au noeud sur lequel l'action est invoquée */ var contextDataNode = menuItem.get_parentMenu().get_contextData(); var value = contextDataNode.get_id().split('_'); var niveau = value[0]; var code = ''; if (value.length > 1) code = value[1]; CallBackEffectuerAction.Callback(menuItem.get_text(), niveau, code); return true; } </script> </asp:Content> <asp:Content ID="ContentMain" ContentPlaceHolderID="MainContentPlaceHolder" runat="server"> <CA:Menu ID="ex_menu1" Orientation="Vertical" EnableViewState="false" SiteMapXmlFile="~/Menu/ex_menu1.xml" ContextMenu="Custom" AutoPostBackOnSelect="true" runat="server"> <ClientEvents> <ItemSelect EventHandler="Menu_onItemSelect" /> </ClientEvents> </CA:Menu> <CA:Menu ID="ex_menu2" Orientation="Vertical" EnableViewState="false" SiteMapXmlFile="~/Menu/ex_menu2.xml" ContextMenu="Custom" AutoPostBackOnSelect="true" runat="server" > <ClientEvents> <ItemSelect EventHandler="Menu_onItemSelect" /> </ClientEvents> </CA:Menu> <asp:UpdatePanel ID="upArbre" runat="server" UpdateMode="Conditional"> <ContentTemplate> <CA:TreeView ID="t1" DragAndDropEnabled="false" NodeEditingEnabled="false" KeyboardEnabled="false" MultipleSelectEnabled="false" CollapseDuration="0" CollapseSlide="None" CollapseImageUrl="~/Dev/img/icones/ouvert.gif" ExpandImageUrl="~/Dev/img/icones/ferme.gif" ExpandDuration="0" ExpandSlide="None" runat="server" Style="cursor: default;" LoadingFeedbackText="Chargement..." EnableViewState="false" ExpandNodeOnSelect="false" CollapseNodeOnSelect="false" PreloadCurrentPath="false" PreRenderAllLevels="false"> </CA:TreeView> </ContentTemplate> </asp:UpdatePanel> <CA:CallBack ID="CallBackEffectuerAction" PostState="true" runat="server" OnCallback="EffectuerAction_Callback" /> </asp:Content>Ma question : est-il possible, après l'appel d'une méthode en CallBack de forcer un PostBack? Si non, y'a-t-il une façon pour contourner le problème?
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 public partial class Structures { #region Chargement private void Page_Load(object sender, EventArgs e) { if (Session[INFO_ACTION] != null) { string[] param = ((string)_session[INFO_ACTION]).Split('_'); EffectuerAction(param[0], param[1], param[2]); } else { // Sinon on initialise l'écran if (!IsPostBack) { InitialiserEcran(); InitialiserStyleArbre(); AssocierMenuContextuel(); ConstruirePremierNiveau(); } } } private void AssocierMenuContextuel() { // Sur le clic droit, on associe le bon menu en fonction de l'utilisateur t1.ClientEvents.ContextMenu = new ClientEvent("t1_onContextMenu"); } #endregion #region Méthodes de Callback protected void EffectuerAction_Callback(object sender, ComponentArt.Web.UI.CallBackEventArgs e) { string param1 = e.Parameters[0]; string param2 = e.Parameters[1]; string param3 = e.Parameters[2]; // On met en session l'action à effectuer, le postback va la lancer. _session[INFO_ACTION] = param1 + "_" + param2 + "_" + param3; } #endregion #region Méthodes privées private void EffectuerAction(string param1, string param2, string param3) { // Pour s'assurer qu'on ne fait l'action qu'une fois _session[INFO_ACTION] = null; // En fonction des params, on redirige vers le bon écran // etc ... } #endregion }
Partager