Asp.net

ASP.net 中是否有 after Page_Load 事件

  • June 27, 2012

是否有在所有 Page_Load事件完成後觸發的事件?

我怎樣才能擁有多個Page_Load

當您擁有使用者控制項時。

在我的頁面可以呈現之前,我需要我的頁面(和所有嵌入式控制項)通過完成他們的Page_Load事件來初始化自己。

當然,問題在於,如果我將程式碼放入頁面的Page_Load處理程序中:

MyPage.aspx
  --> Page_Load
         ---> DoSomethingWithUserControl()
UserControl1.ascx
  --> Page_Load
         ---> initialize ourselves now that viewstate has been restored

UserControl1然後我開始在它準備好之前訪問我的控制項。

我需要一種所有Page_Load事件觸發後、但任何回發事件(例如 Click 事件)觸發之前執行程式碼的方法:

MyPage.aspx
  --> Page_Load
UserControl1.ascx
  --> Page_Load
         ---> initialize ourselves now that viewstate has been restored
MyPage.aspx
  --> Page_AfterLoad
         ---> DoSomethingWithUserControl()

查看 MSDN 中的頁面生命週期,在所有 Page_Loads 完成似乎無法引發事件:

在此處輸入圖像描述

在所有 Page_Loads 完成*之後,*有沒有辦法提高?

Page_LoadComplete是載入所有控制項後引發的事件

請記住,該Init事件首先由所有子控制項觸發,並且當所有控制項都已初始化時,才Init引發頁面事件。事件Load反過來工作,頁面首先引發Load事件,然後每個子控制項引發自己的Load事件。最後LoadComplete提出。請注意,僅當控制項是在設計時創建時才是正確的,當控制項是動態創建時,它們(遺憾地)沒有嚴格遵循這種方法。

來自 MSDN:

如果控制項是在執行時動態創建或在數據綁定控制項的模板中以聲明方式創建的,則它們的事件最初不會與頁面上其他控制項的事件同步。例如,對於在執行時添加的控制項,Init 和 Load 事件在頁面生命週期中發生的時間可能比以聲明方式創建的控制項的相同事件要晚得多。因此,從它們被實例化的那一刻起,動態添加的控制項和模板中的控制項一個接一個地引發它們的事件,直到它們趕上它被添加到 Controls 集合中的事件。

看一看:

(來源:http: //msdn.microsoft.com/en-us/library/ms178472.aspx

在此處輸入圖像描述

編輯 1

為了滿足您的所有要求:

我需要一種在所有 Page_Load 事件觸發後、但在任何回發事件(例如 Click 事件)觸發之前執行程式碼的方法:

我認為最簡單的方法是在使用者控制項中聲明一個自定義事件並在載入控制項後觸發它,然後在您的 ASPX 中訂閱該事件

使用者控制

   public event Action LoadCompleted = delegate { };

   protected void Page_Load(object sender, EventArgs e)
   {
       this.LoadCompleted();
   }

ASPX 頁面

   protected void Page_Load(object sender, EventArgs e)
   {
       this.myUserControl.LoadCompleted += () => 
       {
           // do somethign interesting
           this.lblMessage.Text = DateTime.Now.ToString();
       };
   }

引用自:https://stackoverflow.com/questions/11235062