ScriptManager的AllowCustomErrorsRedirect屬性允許用戶自定義錯誤導向頁,將此屬性設置為true,配合WebConfig的customErrors可以使ScriptManager傳輸發生錯誤時自動導向用戶定義的錯誤導向頁。
ScriptManager的OnAsyncPostBackError事件,當在服務端發生異常時,此事件會觸發,要觸發此事件AllowCustomErrorsRedirect屬性必須為false,否則此事件不會觸發。在此事件處理中,可將服務端異常信息付給客戶端異常信息,如以下代碼
那麼在客戶端如何處理呢?首先得到PageRequestManager的一個實例,並給endRequest方法加入一個事件處理器。在此事件處理器中首先判斷Args參數是否能得到異常對象,通過調用get_error方法,如果得到的錯誤不為空,那麼表示服務端發生了異常,調用set_errorHandled方法,標記此異常已經被處理過。剩下的工作就是通過客戶端代碼呈現這個錯誤的提示信息。注意Args參數中get_error()方法得到錯誤對象之後,這個錯誤對象的message是服務端的AsyncPostBackErrorMessage
UpdatePanel可以完全由服務端加載,也就是說可以直接用代碼動態生成
UpdatePanel up = new UpdatePanel();
up.ID = "UpdatePanel1";
this.Form.Controls.Add(up);
LiteralControl lc = new LiteralControl(DateTime.Now.ToString());
up.ContentTemplateContainer.Controls.Add(lc);
Button btn = new Button();
btn.Text = "Refresh";
up.ContentTemplateContainer.Controls.Add(btn);當然頁面上必須有ScriptManager。注意不要為頁面中的UpdatePanel添加新的Trigger。動態加載Trigger以後,在頁面第一次被打開之後,PageRequestManager記住了這麼一件事情:“Button1造成的提交應該作為異步刷新處理”。因此,在Button1第一次被點擊時,頁面進行了異步刷新。但是,在這次異步刷新之後,PageRequestManager將會忘記所有的這些信息(UpdatePanel、異步提交元素、同步提交元素、超時時間),服務器端這時也會把新的信息給傳輸到客戶端來。說白了,就是在異步刷新PageLoad的時候,RegisterAsyncPostBackControl方法就少了一次調用,導致提交控件成為了傳統的同步刷新控件。解決方案,使用反射機制調用Initialize方法
//得到UpdatePanelTrigger的Initialize方法的反射方法對象
private static MethodInfo triggerInitMethod =
typeof(UpdatePanelTrigger).GetMethod(
"Initialize",
BindingFlags.NonPublic | BindingFlags.Instance);
protected void Page_Load(object sender, EventArgs e)
...{
AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
trigger.ControlID = "Button1";
this.UpdatePanel1.Triggers.Add(trigger);
if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
...{
triggerInitMethod.Invoke(trigger, null);
}
}也就是說在PageLoad的時候,判斷刷新是否是異步刷新,如果是異步刷新,重新調用Trigger的Initialize方法,將異步刷新的提交按鈕重新綁定一次