我在用户控件中的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中的。)
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中的。)
错误: Sys.WebForms.PageRequestManagerServerErrorException: 请选择栏位(客户名称)根本不走我的错误处理方法。
里面
Application_error好像可以
这个是走,但也是会弹出错误: Sys.WebForms.PageRequestManagerServerErrorException: 请选择栏位(客户名称)提示,我觉的奇怪的是为什么我在回发事件中已经有使用
try
{}
catch(){}
了,但就是捕捉不到用户控件抛出来的异常。
要想解决这个问题,楼主可以尝试使用最新版本的AjaxControlToolkit.dll
在webconfig的controls中增加:
<add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit" tagPrefix="ajaxToolkit"/>
在页面中替换默认的ScriptManaer:
<ajaxToolkit:ToolkitScriptManager ID="Tsm1" runat="server"></ajaxToolkit:ToolkitScriptManager>