記不住ASP.NET頁面生命周期的苦惱
發表時間:2020-10-18
發布人:葵宇科技
浏覽次數:24
對于ASP.NET開發者,理解ASP.NET的頁面生命周期是非常重要的。主要是為了搞明白在哪裡放置特定的方法和(hé)在何時設置各種頁面屬性。但是記憶和(hé)理解頁面生命周期裡提供的事件處理方法(method)非常困難。互聯網上有很多關(guān)于頁面生命周期内部機制的文(wén)章,所以本文(wén)隻準備簡單覆蓋技術(shù)的基礎部分,更主要的目的是給大家提供一個(gè)簡單得記憶頁面生命周期的方法。
昆明軟件開發公司中(zhōng)的佼佼者,緻力定制軟件開發,昆明軟件開發請聯系昆明葵宇科技有限公司,電話:15987118523。
準确的記憶ASP.NET頁面生命周期每一個(gè)階段發生了什麼事情是比較困難的,一種便于記憶的方法是根據各個(gè)階段的名字組合出一個(gè)縮寫。微軟的文(wén)檔給出的ASP.NET生命周期如(rú)下(xià):
Page Request
Start
Page Initialization
Load
Validation
Postback event handling
Rendering
Unload
根據這個(gè)組合出一個(gè)縮寫非常容易。既然Page Request技術(shù)上并不是頁面生命周期的一部分(這個(gè)階段僅僅标示我們是否開始一個(gè)頁面周期或者從緩存加載一個(gè)頁面),我們為了方便,就不包括這一階段。
S – Start
I – Initialize
L – Load
V – Validate
E – Event Handling
R – Render
這樣就組合出一個(gè)縮寫“SILVER',這個(gè)英文(wén)單詞非常好記。當然,一定要記住頁面生命周期的最後一個(gè)環節unload沒有包括在裡面。如(rú)果你(nǐ)覺得有必要,你(nǐ)可(kě)以記憶為“SILVER-U”或者“SILVER-YOU",盡管有點破壞這個(gè)記憶法的完美性。現在,我們非常容易就記住了頁面生命周期,接着我們總結一下(xià)每一步都發生了什麼,都有什麼事件伴随着發生。
1. Start
在這個(gè)階段,頁面屬性,比如(rú)Request, Response, IsPostBack和(hé)UICulture 被創建。最為一個(gè)開發人員,大部分時候在這個(gè)階段你(nǐ)不需要做任何事。如(rú)果你(nǐ)需要調用或者重寫(override)這一階段的行為,可(kě)以使用PreInit方法創建或者重新創建動(dòng)态控件,設置master page或者theme或者讀取和(hé)設置profile property的值。要注意的一點是,如(rú)果是回傳(postback)的頁面請求,所有控件的值還沒有從view state裡還原,如(rú)果你(nǐ)在這個(gè)階段設置一個(gè)控件的值,這個(gè)值有可(kě)能在下(xià)面的階段被重寫并覆蓋
2. Initialize
這個(gè)階段對于開發人員是很重要。在這個(gè)階段,theme被應用,所有的控件都被設置了唯一的ID。開發人員在這個(gè)階段可(kě)以調用Init, InitComplete和(hé)PreLoad 方法。微軟關(guān)于這些方法使用的建議如(rú)下(xià):
Init – 這個(gè)事件發生在所有控件被初始化并且皮膚設置也被應用後。使用這個(gè)事件來讀取控件的初始化值。
InitComplete – 這個(gè)事件被Page對象觸發,使用這個(gè)事件處理那些要求所有初始化工作都完成後才能做的事情。
PreLoad - 如(rú)果在頁面或者控件進入Load事件前你(nǐ)有什麼要處理的,使用這個(gè)事件。Page在觸發這個(gè)事件後,Page就會為自己和(hé)所有的控件加載view state并且處理所有Request中(zhōng)的postback數據。
3. Load
這個(gè)階段可(kě)能是開發者使用得最多的一個(gè)階段。在這個(gè)階段,所有的控件被viewstate中(zhōng)信息填充并被加載,OnLoad事件被觸發。在這個(gè)階段你(nǐ)可(kě)以為頁面上所有的服務端控件設置屬性,得到query strings,建立數據庫連接。
4. Validation
如(rú)果你(nǐ)的控件要求驗證,驗證會在這個(gè)階段發生,這個(gè)時候你(nǐ)可(kě)以檢查控件的IsValid屬性。跟這個(gè)階段關(guān)聯的事件是Validate,它有一個(gè)可(kě)以接受驗證字符串群的重載方法(overload method),這個(gè)重載方法執行特定控件群的驗證。
5. Event Handling
所有服務器(qì)端控件的事件處理發生在這個(gè)階段。也就是說Click, SelectedIndexChanged等等這些事件會應用到你(nǐ)的服務器(qì)端控件,如(rú)果是頁面請求是回傳(postback)的話,這些事件的處理函數就會被控件觸發。這個(gè)階段可(kě)以使用的事件如(rú)下(xià):
LoadComplete – 在這個(gè)階段,頁面上所有的控件加載完畢
PreRender – 這裡有幾個(gè)重點,第一:頁面對象(page object)會調用每一個(gè)控件的EnsureChildControls函數,并最終調用自己的。其次:所有具有DataSourceID的數據綁定控件都會調用自己的DataBind函數。要注意的一點是,PreRender事件會發生在一個(gè)頁面的每一個(gè)控件上。在這個(gè)事件的最後,頁面和(hé)所有控件的 ViewState被存儲。
SaveStateComplete – 到這裡,ViewState已經存儲完畢,如(rú)果你(nǐ)有什麼操作不需要修改控件但需要修改ViewState的,可(kě)以放在SaveStateComplete裡面。
6. Render
渲染(Render)實際上不是一個(gè)事件,頁面對象調用每一個(gè)控件的Render方法從而按順序的輸出控件的HTML代碼。編寫用戶自定義控件的開發者對這個(gè)階段最感興趣了,因為輸出用戶自定義HTML代碼的标準做法就是重寫Render方法。如(rú)果你(nǐ)的控件是從ASP.NET服務器(qì)端控件繼承來的,你(nǐ)也許不需要重寫Render方法,除非你(nǐ)想呈現一個(gè)與用戶控件默認行為不同的行為。這些都超出這個(gè)文(wén)檔要讨論的範圍了,如(rú)果想了解更多,請參考 Microsoft's Developing Custom ASP.NET Server Controls. ( http://msdn2.microsoft./zt27com/en-us/librarytfhy.aspx)
7. Unload
最後這個(gè)事件首先是被各個(gè)控件逐一觸發,最後被頁面觸發。在這個(gè)時刻,所有的控件已經被渲染為輸出流(output stream)并且無法被修改。這個(gè)階段中(zhōng),任何試圖對response stream的操作都會引發異常。這個(gè)事件主要用于做一些清理工作,比如(rú)關(guān)閉數據庫連接和(hé)打開的文(wén)件或者登記事件記錄等等其它任務。
頁面周期中(zhōng)都有哪些方法
下(xià)面列出ASP.NET頁面生命周期中(zhōng)所有的方法,這些方法都可(kě)以被重寫(override),要注意的是這些方法有的會遞歸調用,有個(gè)會被頁面中(zhōng)的内容重複調用,這個(gè)列表是按照頁面加載時最通(tōng)用的順序排列的。
Construct
ProcessRequest
FrameworkInitialize
InitializeCulture
If child controls are present:
AddParsedSubObject
CreateControlCollection
AddedControl
ResolveAdapter
DeterminePostBackMode
OnPreInit
OnInit
TrackViewState
OnInitComplete
OnPreLoad
OnLoad
OnLoadComplete
EnsureChildControls
CreateChildControls
OnPreRender
OnPreRenderComplete
SaveViewState
OnSaveStateComplete
CreateHtmlTextWriter
RenderControl
Render
RenderChildren
VerifyRenderingInServerForm
OnUnload
Dispose
結論
在開發ASP.NET程序時,了解什麼時候發生什麼事情是非常重要的。理解頁面中(zhōng)事件是如(rú)何層層展開節省大量撓頭和(hé)查錯的時間。當這些頁面周期中(zhōng)的事件難以記住時,我希望這個(gè)使用的法子(zǐ)能幫助你(nǐ)梳理出在程序裡哪個(gè)地方需要做什麼處理。
我寫這篇文(wén)章是為了幫助大家,也方便了自己。即使是熟練的開發人員有時也會忘記那些先那些後。這篇文(wén)章不是面面俱到,而是希望給初學者和(hé)中(zhōng)級水平的開發者提供一些“小技巧”,從而幫助他們避免一些基本的錯誤