Sys is undefined - Erreur JavaScript avec Microsoft Ajax
Je débute ici une nouvelle série de post du style Question/Réponse/Explication. Il s'agit dans la plupart des cas de questions posés sur le forum aspfr.com ou des questions que l'on me pose directement par mail, msn, ... Le but de cette série est d'abord de partager mon expérience pour vous aidez à corriger vos problèmes mais à la différence es réponses que je donne sur les forums il y aura un point d'explication qui explique plus précisément le problème ainsi que la solution, autrement dit le but n'est pas seulement de vous donner la réponse mais d'expliquer la réponse.
Question :
J'utilise le contrôle UpdatePanel dans ma page mais cela ne fonctionne pas, lorsque je clique sur un bouton toute ma page est rafraichit. Voici le code que j'utilise :
<asp:UpdatePanel id="UpdatePanel1" runat="server">
<contenttemplate>
<asp:Label id="Label1" runat="server" Text="Label"></asp:Label>
</contenttemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" />
</Triggers>
</asp:UpdatePanel>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
J'ai aussi remarqué que lorsque je clique sur mon bouton j'ai un message d'erreur JavaScript : "Sys is undefined".
Réponse :
Le problème vient surement du Web.Config, celui ci n'a pas été modifié pour que Microsoft Ajax puisse fonctionner. Il faut au minimum rajouter cette ligne :
<configuration>
<system.web>
<httpHandlers>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
...
</httpHandlers>
...
</system.web>
...
</configuration>
Explication :
L'erreur "Sys is undefined" pour IE ou "Sys is not defined" pour FF se produit car les fichiers JavaScript de Microsoft Ajax sont indisponible, en effet le ScriptManager va inclure automatiquement les fichiers JavaScript nécessaire au bon fonctionnement du framework client de Microsoft Ajax via ces lignes :
<script src="/ScriptResource.axd?d=V68EtXOYFP73VAKIPaON5vTPHqkLheZqF3UnjXvq8wo-r7vNdqoQSbbVauLUz-mhCwTRANBlv4c3z-L4yfWZdH3gjUwtKrMOUx5U_0sq8ys1&t=633051893704717150" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=V68EtXOYFP73VAKIPaON5vTPHqkLheZqF3UnjXvq8wo-r7vNdqoQSbbVauLUz-mhCwTRANBlv4c3z-L4yfWZdBOq_-pc4gkOWg2S9Y-HfYU_52eTu-Lu2M9kaAkvwx340&t=633051893704717150" type="text/javascript"></script>
Il va aussi faire appel à la fonction Sys.Application.initialize(); pour initialiser le framework client. Cette fonction est définit dans les fichiers JavaScript ajouté plus haut. C'est là que se situe le problème en effet si vous analyser les requêtes HTTP avec Fiddler vous voyez que les 2 fichiers ScriptResource.axd retourne une erreur 404. Ces pseudo-fichiers permettent de retourner un fichier de ressource stocké dans l'assembly System.Web.Extensions.dll. Pour que cela fonctionne il faut absolument enregistrer le handler System.Web.Handlers.ScriptResourceHandler dans le web.config.
La ligne a rajouté est la ligne minimal pour faire fonctionner les UpdatePanels, pour un fonctionnement optimal de Microsoft Ajax il faut rajouter d'autres lignes, un fichier de config exemple est disponible ici : "C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025\web.config"
Autres pistes de recherche :
- Regarder avec fiddler les requêtes http pour voir si les fichiers de ressources sont OK.
- Regarder si vous ne redéfinissez pas le namespace Sys quelque part dans votre page.