我在用户控件中的Page_Load事件中抛出一个异常
protected void Page_Load(object sender, EventArgs e)
{
……
 if (IsPostBack)
                {
                    Control c = null;
                    if (Request.Form["__EVENTTARGET"].Length != 0)
                    {
                        c = Page.FindControl(Request.Form["__EVENTTARGET"]);
                    }
                    else
                    {
                        foreach (string v in Request.Form)
                        {
                            c = Page.FindControl(v);
                            if (c != null)
                            {
                                break;
                            }
                        }
                    }                    if (c != null)
                    {
                        bool CauseValidation = false;
                        if (c is Button)
                        {
                            CauseValidation = ((Button)c).CausesValidation;
                        }
                        else if (c is LinkButton)
                        {
                            CauseValidation = ((LinkButton)c).CausesValidation;
                        }                        if (CauseValidation)
                        {
                            if (Text.Length == 0)
                            {
                                throw new CustomException("请选择栏位(" + new SDTextBox().GetTagName(TagName) + ")");
                            }
                        }
                    }
                }
……
}
调用该用户控件的页面使用了母板页,而母板面的使用了updatepanel,我在母板页做了如下定义:
  <asp:ScriptManager ID="ScriptManager1" runat="server" OnAsyncPostBackError="ScriptManager1_OnAsyncPostBackError"
        AsyncPostBackTimeout="9999999" />然后ScriptManager1_OnAsyncPostBackError的定义如下:
 /// <summary>
        /// 异步回发错误处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ScriptManager1_OnAsyncPostBackError(object sender, System.Web.UI.AsyncPostBackErrorEventArgs e)
        {
#if DEBUG
            this.ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message + e.Exception.StackTrace;
#else
            this.ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message;
#endif
            string errMessage = e.Exception.Message;
            errMessage = errMessage.Replace("\r\n", "-");
            errMessage = errMessage.Replace("\\", "/");
            ScriptManager.RegisterStartupScript(Page, Page.GetType(), new Random().Next().ToString(), "setTimeout('CustomAlert(\"" + errMessage + "\");',0);", true);            return;
        }现在碰到问题是,在用户控件抛出异常后,直接就在页面弹出错误提示了,我要点击确定后,程序才会跑到ScriptManager1_OnAsyncPostBackError事件中来,请问这是为什么呢?我这样处理是不是存在问题?
(我在原意是想在ScriptManager1_OnAsyncPostBackError中做统一的错误提示,因为我的整个页面都是包含量在一个updatepanl中的。)

解决方案 »

  1.   

    CustomException是我自定义的一个异常类。
      

  2.   

    看错误提示好像是 重复定义了 母版里有 updatepanel包涵内容页 则内容页不需再定义
      

  3.   

    现在是直接在页面弹出错误提示:行: 4723
    错误: Sys.WebForms.PageRequestManagerServerErrorException: 请选择栏位(客户名称)根本不走我的错误处理方法。
      

  4.   

    Global.asax
    里面
    Application_error好像可以
      

  5.   


    这个是走,但也是会弹出错误: Sys.WebForms.PageRequestManagerServerErrorException: 请选择栏位(客户名称)提示,我觉的奇怪的是为什么我在回发事件中已经有使用
    try
    {}
    catch(){}
    了,但就是捕捉不到用户控件抛出来的异常。
      

  6.   

    我猜想:微软的客户端js提前拦截并处理了异常,
    要想解决这个问题,楼主可以尝试使用最新版本的AjaxControlToolkit.dll
    在webconfig的controls中增加:
    <add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit" tagPrefix="ajaxToolkit"/>
    在页面中替换默认的ScriptManaer:
    <ajaxToolkit:ToolkitScriptManager ID="Tsm1" runat="server"></ajaxToolkit:ToolkitScriptManager>