程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Asp.net Ajax 學習筆記4 UpdatePanel的使用(上)

Asp.net Ajax 學習筆記4 UpdatePanel的使用(上)

編輯:.NET實例教程

ScriptManager的AllowCustomErrorsRedirect屬性允許用戶自定義錯誤導向頁,將此屬性設置為true,配合WebConfig的customErrors可以使ScriptManager傳輸發生錯誤時自動導向用戶定義的錯誤導向頁。

ScriptManager的OnAsyncPostBackError事件,當在服務端發生異常時,此事件會觸發,要觸發此事件AllowCustomErrorsRedirect屬性必須為false,否則此事件不會觸發。在此事件處理中,可將服務端異常信息付給客戶端異常信息,如以下代碼



ScriptManager.GetCurrent(this).AsyncPostBackErrorMessage = e.Exception.Message;

那麼在客戶端如何處理呢?首先得到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方法,將異步刷新的提交按鈕重新綁定一次

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved