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

UpdatePanels et gestion des erreurs

Avec les anciennes versions d'Atlas la gestion des erreurs avec les UpdatePanels n'étaient pas des plus simples. Depuis Microsoft Ajax extension Beta 1 les choses ont changé, on peut désormais personnaliser la façon dont le client obtient l'erreur.

Prenons un exemple :

<%@ Page Language="C#" AutoEventWireup="true" %> <script type="text/C#" runat="server"> protected void btn1_Click(object sender, EventArgs e) { throw new Exception("Ceci est le message"); } </script> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="SC1" runat="server" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:Button ID="btn1" runat="server" Text="Error" OnClick="btn1_Click" /> <br /> <%=DateTime.Now.ToLongTimeString() %> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html>

Si je clique sur le bouton contenu dans l'UpdatePanel une requête asynchrone va être lancée puis l'exception va être levée et enfin le message d'erreur va s'afficher dans une classique "alert" JavaScript. La première chose que l'on peut faire pour personnaliser ce comportement est de s'abonner à l'évenement AsyncPostBackError du ScriptManager :

<asp:ScriptManager ID="SC1" runat="server" OnAsyncPostBackError="SC1_AsyncPostBackError" />

Puis de renseigner la propriété AsyncPostBackErrorMessage du ScriptManager.

protected void SC1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e) { SC1.AsyncPostBackErrorMessage = "pas de chance, croise les doigts et essaye encore !!!"; }

On aura toujours une alert JavaScript mais avec un message qui fait beaucoup moins peur  :-) On peut aller encore plus loin en rajoutant quelques lignes de JavaScript :

<script type="text/javascript"> window.pageLoad = function(){ // On rajoute une fonction qui s'exécutera a tous les retours de requête Ajax Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender,e){ // On regarde si la requête s'est bien ou mal passé if(e.get_error()){ // On affiche le message d'erreur dans un div $get("error").innerText = e.get_error().description; // On avertit qu'on a traité l'erreur qu'il n'est pas nécessaire d'afficher l'alert JavaScript e.set_errorHandled( true ); } }); } </script>

Désormais l'utilisateur ne voit plus d'alert Javascript mais est avertis de l'erreur via le div d'id "error".

En tant que développeur on aime bien avoir des informations sur le StackTrace et pleins d'autres choses incompréhensible pour le commun des mortels, pour avoir accès à ces informations on peut modifier le code de la sorte :

protected void SC1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e) { if (Context.IsDebuggingEnabled) { SC1.AsyncPostBackErrorMessage = e.Exception.ToString(); } else { SC1.AsyncPostBackErrorMessage = "pas de chance, croise les doigts et essaye encore !!!"; } }

 On voit donc que la gestion des erreurs au niveau des UpdatePanels peut être faite de manière beaucoup plus fine pour le bonheur des utilisateurs. :)


J'ai obtenu cette astuce à travers le blog de Luis Abreu : UpdatePanel: having fun with errors

Posted: mardi 28 novembre 2006 09:25 par cyril
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

lutecefalco a dit :

Bonjour

Je viens de mettre en place cette solution.

Par contre, y a truc qui me chagrine:

e.get_error().description retourne bien le message que j'ai spécifié dans SC1_AsyncPostBackError mais il est précédé de Sys.WebForms.PageRequestManagerServerErrorException.

Y a un moyen de ne pas avoir ça ou il faut "couper" le message côté javascript?

Merci

# août 29, 2008 09:40
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Quelques trucs intéressants (05/09/2010) par CoqBlog le il y a 14 heures et 38 minutes

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

- [HS] Chrome 6 + Moi = Coup de gueule ! par Blog de Jérémy Jeanson le 09-03-2010, 12:12

- [WP7] Utiliser un WrapPanel dans une application Windows Phone 7 par Blog Technique d'Audrey PETIT le 09-01-2010, 22:40

- [WP7] Besoin d’avoir des données en cache par Nicolas Humann le 09-01-2010, 15:12

- [TFS] Comment forcer la saisie d’un Area ou Iteration par Atteint de JavaScriptite Aiguë [Cyril Durand] le 09-01-2010, 02:01

- SQL : Fonctions d'agrégation MIN/MAX et valeurs NULL par CoqBlog le 09-01-2010, 00:04

- Votez pour Warnygo par Nicolas Humann le 08-31-2010, 11:58

- [SharePoint 2010] L'administration toolkit V1 est disponible par Julien Chable le 08-31-2010, 01:42

- Développement Windows Mobile 6.x : Gestion des Forms & Machines d'états par Le Blog de Pi-R (Pierre Cambier) le 08-30-2010, 13:20