ModalPopupExtender et AsyncPostBackTrigger

JulienV Messages postés 13 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 13 mars 2007 - 7 mars 2007 à 09:22
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 - 14 mars 2007 à 01:07
Bonjour

N'est il pas possible d'appeler de faire un appel asynchrone à du code behind depuis un ModalPopup?
Le code ci dessous fonctionne avec:

<
asp
:
PostBackTrigger
ControlID
="OkCtx"

/>






mais j'ai une erreur javascript (Sys.InvalidOperationException: Handler was not added through the Sys.UI.DomEvent.addHandler method ) si j'utilise à la place







<
asp
:
AsyncPostBackTrigger


ControlID
="OkCtx"


EventName
="Click"




/>






Du coup toute la page clignote lorsque je clique sur le bouton OkCtx.
Cela fonctionnait pourtant bien dans une version précédente du toolkit (je n'ai malheureusement pas repéré à partir de quel moment cela n'a plus marché...)








   <
ContentTemplate



>


      <
asp
:
LinkButton


ID
="Submit"


runat
="server"
 
Text
="Submit"></
asp
:
LinkButton
>





<
ajaxToolkit
:
ModalPopupExtender
ID
="mpeSubmit"
runat
="server"
TargetControlID
="Submit"
popupControlID
="pContext"


/>



      (...)

   </
ContentTemplate



>

</
asp
:
UpdatePanel
>






<asp:UpdatePanelID="up2"runat="server"UpdateMode

="Conditional">



   <
ContentTemplate


>
      

// Partie à rafraichir
      


(...)

   </
ContentTemplate


>
   


<
Triggers


>




      <
asp
:
PostBackTrigger
ControlID
="OkCtx"


/>
   


</
Triggers



>

</
asp
:
UpdatePanel
>







   <
ContentTemplate


>




      <
asp
:
Panel
ID
="pContext"
runat
="server"
Style
="display: none;"


>
         




(...)
         




<
asp
:
Button
ID
="OkCtx"
OnClick
="Submit_Click"
runat
="server"
Text
="Ok"></
asp
:
Button


>
      


</
asp
:
Panel



>
   
</
ContentTemplate



>

</
asp
:
UpdatePanel
>

10 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
7 mars 2007 à 15:55
Je viens de tester ce code :

            Cyril - MSP - MCTS ASP.net & SQL
0
JulienV Messages postés 13 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 13 mars 2007
7 mars 2007 à 17:45
Le problème a lieu quand du code est executé coté serveur suite à un clic sur le bouton OkCtx (OnClick ="Submit_Click").
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
7 mars 2007 à 18:00
Que fait le code ?

<hr />Cyril - MSP - MCTS ASP.net & SQL
0
JulienV Messages postés 13 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 13 mars 2007
7 mars 2007 à 18:16
Un appel à une procédure stockée en base puis une mise à jour de ce qu'il y a dans l'UpdatePanel up2 (dans mon cas un GridView).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JulienV Messages postés 13 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 13 mars 2007
7 mars 2007 à 18:23
Mais je viens de le vérifier: l'erreur a lieu même si la méthode Submit_Click ne fait rien...
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
7 mars 2007 à 18:26
et le code que j'ai testé fonctionne chez toi ?

<hr />Cyril - MSP - MCTS ASP.net & SQL
0
JulienV Messages postés 13 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 13 mars 2007
12 mars 2007 à 19:04
Oui, le code que tu as testé fonctionne, mon exemple n'était pas bon...
J'ai finalement isolé le code qui plante vraiment, le voici ci-dessous.

Pour reproduire le problème, cliquer sur Submit puis sur Test.

J'ai au passage trouvé 2 solutions pour corriger ce code:
1) changer l'UpdateMode de l'UpdatePanel "upDetail" en "Always" (solution qui ne m'arrange pas)
2) Déplacer le Panel "pInfo" dans l'UpdatePanel "upDetail"




<
asp
:
ScriptManager



ID
="ScriptManager1"



runat
="server">
</
asp
:
ScriptManager
>








<
asp
:
UpdatePanel



ID
="upAction"



runat
="server"



UpdateMode
="Always">

   <
ContentTemplate
>
      
<
asp
:
Button



ID
="Submit"



runat
="server"



Text
="Submit"></
asp
:
Button
>
      
<
toolkit
:
ModalPopupExtender



ID
="mpeSubmit"



runat
="server"



TargetControlID
="Submit"
PopupControlID
="pContext"



/>
   
</
ContentTemplate
>

</
asp
:
UpdatePanel
>






<
asp
:
UpdatePanel



ID
="upDetail"



runat
="server"



UpdateMode
="Conditional">
   
<
ContentTemplate
>
      
<
asp
:
Button



ID
="Info"



runat
="server"



Text
="Info"



/>
      
<
toolkit
:
ModalPopupExtender



ID
="mpeInfo"



runat
="server"



TargetControlID
="Info"



PopupControlID
="pInfo"
CancelControlID
="Close"



/>
   
</
ContentTemplate
>
   
<
Triggers
>
      
<
asp
:
AsyncPostBackTrigger



ControlID
="Test"



EventName
="Click"



/>
   
</
Triggers
>

</
asp
:
UpdatePanel
>






<
asp
:
UpdatePanel



ID
="upList"



runat
="server"



UpdateMode
="Conditional">
   
<
ContentTemplate
>
      
<
asp
:
Button



runat
="server"



ID
="Test"



Text
="Test"



OnClick
="Test_Click"



/>
   
</
ContentTemplate
>
   
<
Triggers
>
      
<
asp
:
AsyncPostBackTrigger



ControlID
="Submit"



EventName
="Click"



/>
   
</
Triggers
>

</
asp
:
UpdatePanel
>






<
asp
:
UpdatePanel



ID
="ModalPopup"



runat
="server">
   
<
ContentTemplate
>
      
<
asp
:
Panel



ID
="pContext"



runat
="server"



Style
="display: none; width: 300px; height: 200px; background-color: #DDDDDD;">
         
<
asp
:
LinkButton



ID
="Ok"



runat
="server"



Text
="Ok"



OnClick
="Submit_Click"></
asp
:
LinkButton
>

      </
asp
:
Panel
>
      
<
asp
:
Panel



ID
="pInfo"



runat
="server"



Style
="display: none; width: 300px; height: 200px; background-color: #DDDDDD;">
         
<
asp
:
LinkButton



ID
="Close"



runat
="server"



Text
="Close"></
asp
:
LinkButton
>
      
</
asp
:
Panel
>

   </
ContentTemplate
>

</
asp
:
UpdatePanel
>

Merci pour ton aide...
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
13 mars 2007 à 01:23
ok, j'ai reproduis et j'ai compris mais je tente meme pas d'expliquer car dans ma tete c'est tout emmelé, il est tard et je suis fatigué. En gros ca vient de ton CancelControlID de ton mpeInfo, quand tu clicks sur le bouton Test, il fait un refresh de celui-ci, donc il va dispose l'ancien pour en créer un nouveau. Pour éviter les fuites mémoires lors du dispose il faut désabonner les events, donc le mpe va se désabonner de l'event click sur le bouton d'id Close. Sauf que lui a été rafraichis via UpdatePanel donc il n'est pas abonné à cet événement là, et la méthode $removeHandler (ainsi que $clearHandlers) sont stupide à ce niveau là, car si on a pas abonné d'event avec le $addHandler(s) alors il jette une exception. Pour moi c'est donc un (des) bugs de la librairie cliente, tu peux alors essayer de le remonter sur le forum www.asp.net ou directement à Bertrand Leroy (google bleroy : le créateur de la version cliente) mais je garantis pas le succés. Ce bug peut aussi être corrigé au niveau des toolkits meme si je trouve pas ca très propre, donc tu peux aussi le remonter sur codeplexe.

Enfin, si t'as besoin d'une solution urgente, je te donnerais une <strike>astuce</strike> grosse bidouille bien crade.

<hr />Cyril - MSP - MCTS ASP.net & SQL
0
JulienV Messages postés 13 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 13 mars 2007
13 mars 2007 à 08:59
"si t'as besoin d'une solution urgente, je te donnerais une <strike>astuce</strike> grosse bidouille bien crade"

Et que penses tu des 2 contournements que j'ai évoqués?
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
14 mars 2007 à 01:07
c'est un coutournement ! c'est de la triche !!! bouhhhhh :-p

la bidouille c'est de réécrire la fonction $removeHandler
$removeHandler Sys.UI.DomEvent.removeHandler function Sys$UI$DomEvent$removeHandler(element, eventName, handler) {


    var browserHandler = null;    if ((typeof(element._events) !'object') || (element._events null)) return;
    var cache = element._events[eventName];
    if (!(cache instanceof Array)) throw Error.invalidOperation(Sys.Res.eventHandlerInvalid);
    var browserHandler = null;    for (var i 0, l cache.length; i < l; i++) {
        if (cache[i].handler === handler) {
            browserHandler = cache[i].browserHandler;
            break;
        }
    }
    if (typeof(browserHandler) !== 'function') throw Error.invalidOperation(Sys.Res.eventHandlerInvalid);
    if (element.removeEventListener) {
        element.removeEventListener(eventName, browserHandler, false);
    }
    else if (element.detachEvent) {
        element.detachEvent('on' + eventName, browserHandler);
    }
    cache.splice(i, 1);
}

il faut que ce code s'execute juste après le chargement des fichiers Atlas, il faut donc rajouter une référence au fichier qui contient ce code dans le scriptmanager.





<hr />

Cyril - MSP - MCTS ASP.net & SQL
0
Rejoignez-nous