ASP.NET 生命週期
ASP.NET 可以動態的生成頁面,而運作的架構生命週期主要可以分為:
- 應用程式生命週期(Application Life Cycle)
- 頁面生命週期(Page Life Cycle)
[應用程式生命週期(Application Life Cycle)]
- 當使用者透過瀏覽器訪問時,瀏覽器會先向web server傳送請求,
- 在 server 端在一開始都會先執行:
- 建立 ApplicationManager Class 物件
- 建立 HostingEnvironment Class 物件,提供請求來源有關的訊息。
- 建立應用程式初始成員
- 建立 Response 物件,包括 HttpContext,HttpRequest,HttpResponse 都會在這時被初始化建立
- HttpApplication 物件被實體化,並且被指派給 request
- Request 被 HttpApplication class 處理,並根據處理的結果呼叫不同事件
[頁面生命週期(Page Life Cycle)]
當頁面被請求,會先被載入 server 的記憶體中進行處理,接著再傳送回瀏覽器,再將項目從記憶體中卸載
整個頁面生命週期主要有
初始化 (Initialization) 實體化頁面控制 (Instantiation of the controls on the page) 階段修復及維護 執行事件處理程式 顯示頁面
下方列出 ASP.NET 頁面不同階段
-
網頁要求(Page Request)
-
開始進入生命週期(Starting of page life cycle) 在這階段,會檢查來源物件,如果是舊的請求或者是表單 post back,就會將 IsPostBack屬性設定為true
-
頁面初始化(Page Initialization) 在這階段,會指派一個 UNID 給頁面的控制屬性給新的請求, 若是舊的請求或 post back,則會沿用之前的控制屬性,並且針對 post back 相關處理進行調整
-
載入頁面(Page Load) 控制屬性會根據view states 以及 control state 值進行設定
-
驗證(Validation) 如果請求有呼叫 validation 方法,validation 控制就會被啟用及執行 IsValid 屬性會被設定為true
-
PostBack事件處理(PostBack Event Handling) 如果請求來源屬於 postback(old request),就會執行處理
-
渲染頁面(Render) 在這階段,view state 以及 controls 都已經被執行及儲存, 接著,主要的輸出頁面流程都會開始在 OutputStream Class 裡處理
-
卸載(Unload) 渲染過的頁面會被傳送到client端。 頁面相關請求及反應,接著就會被卸載清除。
[整個頁面生命週期事件]
每一個頁面的生命週期,都會觸發一些事件
這些事件通常都是函式或者次路由的形式,可以直接透過 Onclick 或者 handle 來觸發。
下方是常用的一些頁面生命週期事件:
**PreInit ** - PreInit 是頁面生命週期第一個事件,會檢查IsPostBack以及是哪個頁面 postback。 可以動態設定 themes 屬性。可以透過 OnPreInit方法或建立一個 Page_PreInit 來處理對應的事件。
Init - Init event initializes the control property and the control tree is built. This event can be handled by overloading the OnInit method or creating a Page_Init handler.
InitComplete - 可以用來追蹤 view state。
LoadViewState - 可以將 view state 資訊載入controls。
LoadPostData - 在這個階段,所有 input 欄位的內容都會被form標籤所定義及處理。
PreLoad - PreLoad 會在post back data載入controls之前啟用,這個事件可以用來overloading OnPreLoad方法,或者可以建立一個 Page_PreLoad。
Load - Load 事件會在頁面一開始準備載入之前被呼叫,呼叫之後會遞迴的處理每個子控制項目,執行相同動作。可以透過 overloading OnLoad 方法,或者建立一個 Page_Load handler。
LoadComplete - Loading 程序完成時,會呼叫LoadCompolet,這個事件可以透過 overloading OnLoadComplete方法或者建立一個Page_LoadComplete handler。
PreRender - 這個事件只有在 output rendered 時才會觸發,透過這個事件,頁面及controls可以在output rendered之前執行任何更新。
PreRenderComplete - 當 PreRender完成時候被執行。
SaveStateComplete - 當頁面control階段被儲存時,view也被儲存,HTML markup建立。這個階段能夠用來 overriding Render 方法或者建立一個 Page_Render handler。
UnLoad - 頁面生命週期的最後一個階段,可以在這裡關閉一些連線或者清除不會用到的資料。