記不住ASP.NET頁面生命周期的苦惱 - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不管是網站(zhàn),軟件還是小程序,都要直接或間接能為您産生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站(zhàn)成為營銷工具,讓軟件能切實提升企業(yè)内部管理水平和(hé)效率。優秀的程序為後期升級提供便捷的支持!

您當前位置>首頁 » 新聞資(zī)訊 » 技術(shù)分享 >

記不住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)級水平的開發者提供一些“小技巧”,從而幫助他們避免一些基本的錯誤
 

相關(guān)案例查看更多