JulienV
Messages postés13Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention13 mars 2007
-
7 mars 2007 à 09:22
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 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é...)
JulienV
Messages postés13Date d'inscriptionmardi 3 février 2004StatutMembreDernière intervention13 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"
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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.
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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.