2009-01-12 8 views
2

J'ai créé une application Web qui a l'architecture suivante: Chaque formulaire est un UserControl, il y a juste une page réelle (Default.aspx), et un paramètre dans l'URL spécifie quel UserControl charger. Le UserControl est chargé dans un UpdatePanel afin qu'il puisse profiter pleinement d'AJAX.ASP.NET AJAX WebForms question de gestion d'erreur personnalisée

Il existe également un mécanisme d'affichage de message élaboré que j'utilise. Finalement, les messages se retrouvent dans une zone désignée au-dessus du fichier Default.ASPX avec quelques bonnes choses de formatage.

Maintenant, je voudrais également capturer toutes les exceptions non gérées qui proviennent du contrôle UserControl et l'afficher dans cette zone avec tous les cloches-et-sifflets que j'ai faits pour les messages.

Comment est-ce que je peux faire ceci? Le Page.Error et ScriptManager.AsyncPostBackError en quelque sorte ne fonctionne pas pour moi ...

Répondre

0

Je ne suis pas sûr si vous vouliez dire Page.Error sur votre page principale ne fonctionnait pas ou sur les contrôles de l'utilisateur eux-mêmes. Si vous ne l'avez pas déjà fait, vous pouvez essayer de créer la classe suivante:

public class CustomUserControl : UserControl 
{ 
    public new CustomUserControl 
    { 
     this.Error += new EventHandler(Page_Error); 
    } 

    protected void Page_Error(object source, EventArgs e) 
    { 
     Exception exception = HttpContext.Current.Server.GetLastError(); 
     // Message away 
    } 
} 

Ensuite, changez tous vos utilisateurs contrôle d'hériter de cette classe à la place.

+0

C'est une idée. Mais peut-être que je peux le faire en quelque sorte sur le niveau Default.aspx? –

+0

Je ne sais pas à peu près tout, mais vous pouvez changer Page_Error pour être public dans votre classe _Default et changer le constructeur pour CustomUserControl à this.Error + = new EventHandler (((_ Default) this.Page) .Page_Error); –

+0

La vérité est - Je voulais éviter que mes commandes usercontrols héritent d'une classe de base spécifique. C'est possible, mais je préférerais ne pas. Vous voyez, ils viennent des assemblys de plugin, et je m'attends à ce qu'il y en ait beaucoup à l'avenir. J'essaie de leur imposer le moins d'exigences possible. –

0

Pouvez-vous donner plus de détails sur ce que vous avez essayé avec ScriptManager.AsyncPostBackError? Cela devrait vraiment être la bonne chose à utiliser.

1

La réponse complète est dans mon article de blog - Unhide Exceptions Hidden By AJAX.

J'utilise AsyncPostBackError() pour modifier le message d'erreur du générique "Exception a été levée par la cible d'un appel" au message d'erreur réel. Je mis une étiquette au texte d'erreur et je dis que je AJAX manié l'erreur avec

args.set_errorHandled(true); 
0

Pour les erreurs non gérées regarder le fichier Global.asax ...

protected void Application_Error(object sender, EventArgs e) 
{ 

    // fired when an unhandled error occurs within the application. 
    // ..or use an HttpModule instead 
} 

ou créer une coutume HttpModule à la place que vous branchez votre web.config ...

public class UnhandledExceptionModule : IHttpModule 
{ 
    #region IHttpModule Members 
    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication app) 
    {   
     app.Error += new EventHandler(app_Error); 
    } 

    protected void app_Error(object sender, EventArgs e) 
    { 
     HttpApplication app = sender as HttpApplication; 
       Exception ex = app.Server.GetLastError().GetBaseException();