只有累積,沒有奇蹟

2018年10月2日 星期二

[.NET] ASP.NET 網頁生命週期 Page Life-Cycle

使用者透過瀏覽器發送一個請求(Request)到伺服器端,伺服器端會依照請求內容讀取所需要的資料,並建立ASP.NET Page物件,當執行 ASP.NET 網頁時,網頁在生命週期內會執行一系列處理步驟。其中包括初始化、產生控制項、還原和維護狀態、執行事件處理常式程式碼和呈現(參考MSDN網站)。伺服器端將結果組成網頁程式碼(HTML)供瀏覽器讀取及呈現,回傳結果分為兩個部分,第一部分為網頁的呈現資料(HTML Tag)、第二部份為(hidden input:存放viewstate,ASP.NET用來紀錄網頁資料的方式)。
關係請參考下圖

前言

    當一個頁面請求發送到Web 服務器,ASP.NET 網頁會進行生命週期一系列的步驟,這些步驟包括初始化、載入、事件處理、顯示….等階段,在網頁生命週期的每個階段中,都會觸發不同的事件,因此了解ASP.NET 網頁生命週期對開發人員是很重要的,知道在什麼時間點會觸發哪些事件及可以設定網頁的屬性,舉例來說,今天要動態改變主題,就必須到PreInit事件修改Page的Theme屬性;假設要動態建立控制項,就必須在每次Postback事件時將控制項重新建立起來,否則Postback之後動態建立的控制項將會找不到。如果對於網頁生命週期不熟悉的話,在遇到上列問題時,相信會花更多不必要的時間才能解決問題。
概述
    使用者透過瀏覽器發送一個請求(Request)到伺服器端,伺服器端會依照請求內容讀取所需要的資料,並建立ASP.NET Page物件,當執行 ASP.NET 網頁時,網頁在生命週期內會執行一系列處理步驟。其中包括初始化、產生控制項、還原和維護狀態、執行事件處理常式程式碼和呈現(參考MSDN網站)伺服器端將結果組成網頁程式碼(HTML)供瀏覽器讀取及呈現,回傳結果分為兩個部分,第一部分為網頁的呈現資料(HTML Tag)、第二部份為(hidden input:存放viewstate,ASP.NET用來紀錄網頁資料的方式)。
關係請參考下圖
LifeCycle

Page Life-Cycle Stages(生命週期階段)

網頁的生命周期分為下列八個階段,每個階段所做的事MSDN都寫得很清楚,這裡就不在多介紹
  1. 網頁要求(Page Request)
  2. 啟動(Start)
  3. 初始化(Page Initialization)
  4. 載入(Load)
  5. 驗證(Validation)
  6. 事件處理(PostBack Event Handling)
  7. 顯示(Render)
  8. 卸載(Unload)
如何很快的記下這幾個階段?這裡有提供一個很容易記下這八個階段的方法,根據八個階段的英文縮寫,可以組合出”SILVERU”這個英文單字,這樣變得好記多了

SILVERU

Page Life-Cycle Events(生命週期常用事件)
在網頁生命週期的每個階段中,都會觸發不同的事件,舉例來說,初始化(Page Initialization)階段會觸發Page物件的PreInit、Init、InitComplete事件
MSDN網站有列出開發者常使用的
網頁生命週期事件列表,包含PreInitInitInitCompletePreLoadLoad、Control Event、LoadCompletePreRenderSaveStateCompleteRenderUnload等幾項常用的生命週期事件。
這裡整理出每個階段常用的事件,請參考下圖
StageandEvents
  • Page initialization
    事件:PreInit、Init、InitComplete
    說明:在這個階段,網頁(Page)及控制項(Control)會進行初始化,可以判斷是請求(Resquest)來源是第一次請求或是Postback、動態建立控制項、動態設定主版頁面、動態設定Theme屬性設定。
  • Loading
    事件:PreLoad、Load、LoadComplete 
    說明:如果是Postback,此階段會將ViewState載入到控制項的屬性中。最常看到的Page_Load事件就是在此階段中。
  • Postback event handling
  • Page initialization
    事件:處理控制項所觸發的事件
    說明:這些控制項事件可以用於處理特定控制項事件,例如Button控制項的Click事件。
    (特定控制項事件:按下Button的click事件,事件流程會是Page initialization > Loading> Button_Click事件,只有Postback才會進入此事件)
  • Rendering
    事件:PreRender、Render 
    說明: 顯示網頁階段,Page物件會呼叫SaveViewState的方法來儲存ViewState的資訊,接下來Page物件呼叫Render方法(先Page,在Page底下的Control),透過Render方法,會將根據控制項的類型,輸出所對應類型的外觀及長相(HTML Tag),並存放在Response的OutputStream屬性中。Ps : Render不是一個真正的事件
  • Unloading
    事件:Unload
    說明:在這個事件中,所有的控制項都已經被Render為OutputStream,無法修改OutputStream內容,否則網頁就會爆炸擲回例外狀況。在控制項中,這個事件可以用於對特定控制項執行最終清除,例如關閉控制項特定的資料庫連接。
補充:
    在查資料的過程中,很幸運的找到一篇文章(Page LifeCycle),這篇文章從PreInit到最後的Unload,作者很詳細的介紹網頁生命週期事件(如下圖所示),而且每個流程都有加上說明文字介紹(超讚!),有興趣深入研究的朋友可以自行取用,如下圖所示
LifeCycleDetail
PS 作者提到此事件流程為ASP.NET 2.0的版本,有些事件及內容有可能已經有異動過!

參考
之前在開發專案時,發覺自己對於生命週期的事件有些疑惑
所以開始上網找有關Page Life-Cycle資料,看越多相關資料,才發現自己懂得真的很少
將資料整理後寫成這篇文章方便自己紀錄,如果內容有錯誤的地方,麻煩各位高手給予小弟指導,謝謝 :D
ps :如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,感謝 

Related Posts:

  • [UnitTest] 如何測試目標方法中含有 static method 代碼 ? 情境 由於部門過去的 專案幾乎都沒有加上單元測試進行保護,主管在新的一年規劃中開發代碼更有品質,希望開發的專案加上新功能或是修改時要加上單元測試,有些 Legacy Code 寫法是屬於一條龍式的 「義大利麵式碼」特別有親切感(大誤,遇到這種就需要先重構 (refactor) 後物件化比較好寫單元測試,今天主題是單元測試中要被測試的 method 中常常會有相依於某個 Static method,在寫 Code 時用… Read More
  • [CheatSheets] ASP.NET MVC 5 Pipeline 前言  在 ASP.NET 開發時生命週期 Life cycle 一直是個很重要的議題,在過去自己為了加深這方面的印象分別針對 ASP.NET Application 寫了篇文章 : [.NET] ASP.NET Application 概述,以及古老時代在開發 WebForm 時寫的 : [.NET] ASP.NET 網頁生命週期 Page Life-Cycle,在撰寫文章的過程中也加深了自己對於 … Read More
  • [C#] Named Arguments 具名引數前言  同事在開發專案時詢問某 method 有多個參數,有些參數是選擇輸入有預設值,因參數太多是否有方法可以指定參數名字 ? 否則一堆有設定預設值的在閱讀代碼會造成困擾,不小心也可能傳入錯誤變數,聽到當下建議抽成一個 Model 這樣更容易維護,但他表示由於引用的方法過多會擔心會牽一髮動全身,會有不可預期和毀滅性的災害發生,因此可以使用 具名引數 named arguments 來指定需要傳入的… Read More
  • [.NET] Default 和 NativeImage 資料夾問題 收到同事反應公司 Server C:\ 硬碟空間嚴重不足,確認後發現 C:\errors 資料空間占了 25g 而且還以驚人的速度成長中,進到資料夾底下查看分 Default 與 NativeImage folder 存放各種應用程式 Log ,如下圖所示 其中竟然還有 w3wp.exe,到底這些是如何記錄的呢 ? 本篇文章簡單記錄解決問題的過程 解決方案 為了追根究柢,點開其中 w3wp.exe 資料… Read More
  • [.NET] 字串加密 MD5、SHA1 常在開發中遇到需要將特定資料加密的動作,在儲存到資料庫中(比如說網站用戶的密碼加密後存到資料庫中,用戶在登入時,在把用戶輸入的密碼進行加密,再與資料庫密碼欄位比較是否一致)在.NET Framework中,可以透過 System.Security.Cryptography 命名空間來產生加密演算法的金鑰(註一),在用雜湊值(Hash Value)的加密方式達到目的,雜湊演算法將任意長度的二進位值對應到固定長度較小的二進位值,稱為雜湊值 (Ha… Read More

1 則留言:

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com