Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    Consultant freelance, n'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

OutputCache et ScriptManager – Attention, seul le rendu est caché

Lorsque j’utilise un UserControl et que j’ai besoin d’inclure des scripts JavaScript, j’utilise un ScriptManagerProxy. L’avantage du ScriptManagerProxy est qu’il n’inclut le script qu’une seule fois, qu’importe si le UserControl se répète ou si l’on inclut le même script via un autre ScriptManagerProxy.

Récemment j’ai eu besoin d’activer du cache ASP.net sur un tel UserControl. J’ai donc utilisé la directive @OutputCache afin de mettre en place ce cache. Mon UserControl ressemblait alors à ceci :

<%@ Control Language="C#" %> <%@ OutputCache Duration="60" VaryByParam="none" %> <asp:ScriptManagerProxy runat="server"> <Scripts> <asp:ScriptReference Path="~/js/pouet.js" /> </Scripts> </asp:ScriptManagerProxy> <%= DateTime.Now.ToLongTimeString() %>

Lors du premier affichage d’une page contenant cet UserControl, tout se passe bien, le script est correctement chargé. Par contre si j’actualise cette page, alors mon UserControl provient du cache mais le script JavaScript, lui, n’est pas chargé.

Pourquoi ?

Afin de comprendre d’où vient le problème, il faut comprendre ce que fait la directive OutputCache. Lorsque ASP.net rencontre une telle directive, il va alors créer un contrôle héritant de PartialCachingControl. Ce contrôle va alors se charger de gérer le cache : si le rendu du contrôle est présent dans le cache ASP.net va utiliser le rendu HTML du UserControl présent en cache, sinon il va utiliser le UserControl.

C’est ici qu’est le problème : lorsqu’ASP.net utilise le cache, il n’exécute pas les différents événements du UserControl (Init, Load, …). Dans notre cas, le ScriptManagerProxy ajoute les scripts dans le ScriptManager de la page lors de son événement Load.

Ce problème est présent avec le ScriptManagerProxy, mais il se retrouve dès que vous modifier le HTML à l’extérieur du UserControl à partir de celui-ci. Si vous utilisez par exemple les fonctions du ScriptManager ou du ClientScript comme le RegisterClientScript, vous serez alors aussi confrontés à ce souci.

Comment faire ?

Il n’y a pas de solution à ce problème, il s’agit d’un “bug” by design. Si l’on souhaite rajouter du cache sur un UserControl utilisant un ScriptManagerProxy, il faut déplacer le ScriptManagerProxy au niveau de la page.

L’ajout de cache sur un UserControl n’est donc pas une chose bénigne, il faut bien s’assurer que les événements du UserControl ne modifie pas le HTML de la page.

Et vous, avez vous déjà rencontré de tel soucis ?

Posted: jeudi 17 décembre 2009 00:13 par cyril
Classé sous : , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Parution de mon livre sur WPF 4 par Perspective le il y a 1 heure et 45 minutes

- EDM : comment utiliser l’Horizontal Entity Splitting par Matthieu MEZIL le il y a 14 heures et 53 minutes

- [WP7Dev][Reactive] Rendre les Reactive Extensions Plus Stables par Jerome Laban le 09-08-2010, 02:24

- [SharePoint 2010] [Visio] Manipulation n°1 : Comment générer automatiquement la carte d’un site Web avec Visio ? par Le blog de Patrick le 09-07-2010, 14:12

- WinDbg / SOS / PSSCOR2 : Failed to load data access DLL (mscordacwks) par CoqBlog le 09-06-2010, 22:29

- Perspective 2.0 : version finale par Perspective le 09-06-2010, 19:42

- SharePoint 2010 : Comparaison entre la version 2007 et la version 2010 par Philippe Sentenac [MVP SharePoint] le 09-06-2010, 12:00

- Utilisation de la réplication SQL dans le code .NET d'une application mobile - Implémentation & Conseils : PARTIE 1/3 (classe SqlCeReplication & premi... par Le Blog de Pi-R (Pierre Cambier) le 09-06-2010, 08:37

- Quelques trucs intéressants (05/09/2010) par CoqBlog le 09-05-2010, 14:53

- EnumerableCollection par Matthieu MEZIL le 09-03-2010, 23:23