【问题标题】:ASP.NET AJAX WebForms custom error handling questionASP.NET AJAX WebForms 自定义错误处理问题
【发布时间】:2010-09-30 21:38:19
【问题描述】:

我制作了一个具有以下架构的 Web 应用程序:每个表单都是一个 UserControl,只有一个实际页面 (Default.aspx),并且 URL 中的一个参数指定要加载哪个 UserControl。 UserControl 被加载到 UpdatePanel 中,这样它就可以享受完整的 AJAX 特性。

我还使用了一种精心设计的消息显示机制。最终,消息最终会出现在 Default.ASPX 顶部的一个指定区域中,并带有一些不错的格式。

现在,我还想捕获源自 UserControl 的任何未处理的异常,并将其与我为消息所做的所有花里胡哨的内容一起显示在此区域中。

我该怎么做? Page.Error 和 ScriptManager.AsyncPostBackError 对我不起作用...

【问题讨论】:

    标签: asp.net ajax error-handling


    【解决方案1】:

    我不确定您的意思是主页上的 Page.Error 不起作用还是用户控件本身上的错误。如果您还没有这样做,您可以尝试创建以下类:

    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
       }
    }
    

    然后将所有用户控件更改为继承此类。

    【讨论】:

    • 这是一个想法。但也许我可以在 Default.aspx 级别上以某种方式做到这一点?
    • 我不知道全部内容,但您可以将 Page_Error 更改为在您的 _Default 类中公开,并将 CustomUserControl 的构造函数更改为 this.Error += new EventHandler(((_Default)this.Page)。 Page_Error);
    • 事实是——我想避免让我的用户控件继承自特定的基类。这是可能的,但我宁愿不这样做。你看,它们来自插件程序集,我预计将来会有很多这样的。我尽量减少对他们的要求。
    • 抱歉耽搁了。您能否发布一些动态加载这些控件的代码?我假设这就是你正在做的事情。如果是这样,则 Error 事件是公开的,因此您可以从 _Default 页面中添加 EventHandler。
    【解决方案2】:

    您能否更详细地说明您对 ScriptManager.AsyncPostBackError 的尝试?这确实应该是正确的使用方法。

    【讨论】:

      【解决方案3】:

      完整的答案在我的博文中 - Unhide Exceptions Hidden By AJAX

      我确实使用 AsyncPostBackError() 将错误消息从通用的“调用目标抛出异常”更改为真正的错误消息。我为错误文本设置了一个标签,然后告诉 AJAX 我用

      处理了错误
      args.set_errorHandled(true);
      

      【讨论】:

        【解决方案4】:

        对于未处理的错误,请查看 Global.asax 文件...

        protected void Application_Error(object sender, EventArgs e)
        {
        
            //  fired when an unhandled error occurs within the application.
            //  ..or use an HttpModule instead
        }
        

        或者创建一个自定义的 HttpModule 来代替你的 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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-29
          • 2010-12-07
          • 2011-06-23
          • 2010-09-28
          • 2013-01-04
          • 2010-11-13
          • 2010-12-24
          相关资源
          最近更新 更多