這篇文章主要給大家介紹了關於Asp.NET頁面中事件載入的先後順序,文中通過圖文以及範例程式碼介紹的非常詳細,對大傢具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
本文主要給大家介紹了關於Asp.NET頁面事件載入先後順序的相關內容,分享出來供大家參考學習,下面話不多說,來一起看看詳細的介紹:
ASP.NET 主版頁面和內容頁中的事件
我們知道主版頁面和內容頁都可以包含控制項的事件處理常式。對於控制項而言內容頁中的控制項在內容頁中引發事件,主版頁面中的控制項在主版頁面中引發事件。控制項事件不會從內容頁發送到主版頁面,也不能在內容頁中處理來自主版頁面控制項的事件,它們只會在自己事件內部進行處理。
下面是主版頁面(Master)與內容頁(ContentPage)合并後事件的發生順序:
Master頁面控制項 Init 事件。ContentPage頁面控制項 Init 事件。Master頁 Init 事件。ContentPage頁 Init 事件。ContentPage頁 Load 事件。Master頁 Load 事件。ContentPage頁面控制項 Load 事件。ContentPage頁面 PreRender 事件。Master頁面 PreRender 事件。Master頁面控制項 PreRender 事件。ContentPage頁面控制項 PreRender 事件。
主版頁面和內容頁中的事件順序對於頁面開發人員並不重要。但是,如果建立的事件處理常式取決於某些事件的可用性,瞭解主版頁面和內容頁中的事件順序很有協助。
Asp.Net中頁面事件載入的先後順序
1、單獨一個Page 執行中將按照如下順序啟用事件:
Page.PreInitPage.InitPage.InitComplitePage.PreLoadPage.LoadPage.LoadCompletePage.PreRenderPage.PreRenderComplete
2、如果頁面從另一個頁面繼承,如BasePage:System.Web.UI.Page
,在BasePage中添加了一下驗證功能,如是否登入、是否擁有許可權等方面的檢查,而其它頁面從BasePage繼承,則BasePage和最終Page的事件啟用順序是:
BasePage.PreInitPage.PreInitBasePage.InitPage.InitBasePage.InitComplitePage.InitCompliteBasePage.PreLoadPage.PreLoadBasePage.LoadPage.LoadBasePage.LoadCompletePage.LoadCompleteBasePage.PreRenderPage.PreRenderBasePage.PreRenderCompletePage.PreRenderComplete
3、如果使用了MasterPage,則MasterPage中的事件和ContentPage中的事件按照下面順序啟用:
ContentPage.PreInitMaster.InitContentPage.InitContentPage.InitCompliteContentPage.PreLoadContentPage.LoadMaster.LoadContentPage.LoadCompleteContentPage.PreRenderMaster.PreRenderContentPage.PreRenderComplete
需要注意的是Master裡面是沒有PreInit事件。
4、如果ContentPage繼承BasePage,那麼,各事件的執行順序將變成:
BasePage.PreInitContentPage.PreInitMaster.InitBasePage.InitContentPage.InitBasePage.InitCompliteContentPage.InitCompliteBasePage.PreLoadContentPage.PreLoadBasePage.LoadContentPage.LoadMaster.LoadBasePage.LoadCompleteContentPage.LoadCompleteBasePage.PreRenderContentPage.PreRenderMaster.PreRenderBasePage.PreRenderCompleteContentPage.PreRenderComplete
只需要記住:先載入繼承頁,再載入自己,如果繼承頁有繼承則先載入繼承頁的繼承。
事件處理器名稱 |
發生時間 |
Page_Init |
在Web表單的檢視狀態載入伺服器控制項並對其初始化。 這是表單生命週期的第一步 |
Page_Load |
在Page對象上傳入伺服器控制項。由於此時檢視狀態資訊是可以使用的,因此載這裡可以用代碼來改變空間的設定或者載頁面上顯示文本。 |
Page_PreRender |
應用程式將要呈現Page |
Page_Unload |
頁面從記憶體中卸載 |
Page_Error |
發生未處理的異常 |
Page_AbortTransaction |
交易處理被終止 |
Page_CommitTransaction |
交易處理被接受 |
Page_DataBinding |
把頁面上的伺服器空間和資料來源綁定載一起 |
Page_Disposed |
Page對象從記憶體中釋放掉。這是Page對象生命週期中的最後一個事件 |
Init,Load,PreRender事件執行順序:
1)控制項的Init事件
2)控制項所在頁面的Init事件
3)控制項所在頁面的Load事件
4)控制項的Load事件
5)控制項所在頁面的PreRender事件
6)控制項的PreRender事件
個人研究的一些心得體會:(下面的兩點可以通過自建頁面並重寫相關事件進行驗證)
1.Init事件從最裡面的控制項(例如使用者控制項)向最外面的控制項(頁面)引發,Load及PreRender等其他事件從最外面的控制項向最裡面的控制項引發。
2.控制項之間相同事件的執行順序依控制項在頁面的位置按從左至右,從上到下的先後順序執行。
注意:
1. 切記使用者控制項也被視為頁面中的一個控制項;
2. 把使用者控制項作為單獨的一個特殊頁面來看,它本身及其所包含的控制項同樣遵守相同的規律。
3. 如果用戶端程式(如JavaScript)中會用到用戶端body對像的onload事件,注意這個用戶端事件是最後執行,即在伺服器端所有事件執行完後才執行。
4. Master、使用者自訂控制項裡面是沒有PreInit、OnComplete事件.Master本身就是一個使用者控制項usercontrol,usercontrol繼承TemplateControl,TemplateControl繼承Control,讓我們看看Control裡面可重寫的事件(部分),也可以查看此官方文檔:https://referencesource.microsoft.com/#System.Web/UI/Control.cs,87dbac93d9749fa2。