ASP.NET 生命週期

ASP.NET 可以動態的生成頁面,而運作的架構生命週期主要可以分為:

  • 應用程式生命週期(Application Life Cycle)
  • 頁面生命週期(Page Life Cycle)

[應用程式生命週期(Application Life Cycle)]

  1. 當使用者透過瀏覽器訪問時,瀏覽器會先向web server傳送請求,
  2. 在 server 端在一開始都會先執行:
  • 建立 ApplicationManager Class 物件
  • 建立 HostingEnvironment Class 物件,提供請求來源有關的訊息。
  • 建立應用程式初始成員
  1. 建立 Response 物件,包括 HttpContext,HttpRequest,HttpResponse 都會在這時被初始化建立
  2. HttpApplication 物件被實體化,並且被指派給 request
  3. 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 - 頁面生命週期的最後一個階段,可以在這裡關閉一些連線或者清除不會用到的資料。