程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> [轉]aspx的生命周期

[轉]aspx的生命周期

編輯:.NET實例教程


頁面被請求時,第一個被執行的總是構造函數(constructor). 你可以在這裡初始化很多自定義屬性或對象。不過這裡有一些限制,因為 page 還沒有被完全初始化。特別地,你必須使用 HttpContext.Current 來訪問 QueryString, Form, CookIEs 集合,以及 Cache 對象。而 Session 對象在 constructor 裡是無法訪問的。

下面接著執行的是 AddParsedSubObject 方法,這個方法把組成該 page 的所有子控件添加到控件集合樹中。在很多高級的頁面模板解決方案中,該方法通常被覆蓋,以便把頁面的控件添加到一個特殊的頁面模板中去。該方法遞歸的被子控件調用,所有這些子控件都是這時候初始化的,從最裡面的開始。

接著是 DeterminePostBackMode 方法。該方法允許你影響 IsPostBack 的值,以及相關事件。如果你想從數據庫中加載 ViewState 以便 redirect 時,這個可能對你有用。因為 VIEwState 僅僅在 IsPostBack 為 true 的時候被恢復。
你可以通過返回 null 來強制不 postback, 或者返回 Request.Form 來強制 postback. 這個方法是不推薦使用的,除非是在特殊的情況下,因為他還影響其他的事件。

然後是 OnInit 方法。通常這是我們使用到的第一個方法。這時,所有控件已經被初始化,也就是說所有原始值都被設定了。而 VIEwState 以及所有其他 post 的值還沒有被應用到控件上。也就是說這時候所有通過代碼或者用戶操作做的更改還沒有被恢復。這通常是創建或重新創建動態控件的最佳時機。

恢復和加載(Restore and Load)

接下來的 LoadPageStateFromPersistenceMedium 方法,僅僅在 PostBack 時被執行。當你要改變保存 ViewState 的方法時(使用 Session 或其他自定義的儲存方法),覆蓋這個方法,以及後面的 SavePageStateToPersistenceMedium 方法。注意:該方法並不真正加載 VIEwState 到 page 及其子控件。

VIEwState 被取回後,接著 LoadVIEwState 方法將它們恢復到 page, 並遞歸的恢復到每一個子控件(只有 PostBack 的那些).這時,每個控件已經被恢復到了它上次執行時的狀態,但用戶 post 的值還沒有被應用。因為這屬於 VIEwState. 這個方法是恢復所有在事件中創建的動態控件的最好時機。

下一個是 ProcessPostData 方法。僅僅在 PostBack 時被執行。而且這個方法不能被覆蓋,因為它是頁面基類中實現的一個私有方法。這個方法最終將用戶 post 的值,通過匹配控件的名稱的方法,恢復到頁面。這時,page 已經被完全恢復了。動態控件必須在這個方法之前被創建。這個方法同時也為稍後的 changed 事件記錄控件值的改變。

然後才是 OnLoad 方法。大部分的代碼中都使用這個方法,因為這是在 page 的生命周期中,第一個所有的值都被恢復了的地方。我們可以通過檢查 IsPostBack 屬性來避免不必要的重設狀態。同時也可以檢查 IsValid 屬性來進行驗證。同時還可以在這裡創建動態控件。所有這些控件的方法都會被執行並捕獲,包括 VIEwState. 但回發的值不可以。

$False$

Raised Events

下一個方法,ProcessPostData 方法, 實際上是前面那個方法的第二個入口(second pass)。它僅僅處理回發,而且由於是私有方法,所以不能被覆蓋。這個方法顯得有些奇怪,但又是必要的。因為在 OnLoad 方法中重建的動態控件需要他們回發的值。所有在這個方法之後創建的動態控件,將只能恢復 VIEwState, 而不能恢復回發的值,並且不能觸發任何更改事件。

下一個方法, RaiseChangedEvents, 同樣僅僅用於回發時。它是一個基類實現的私有方法。這時 changed 事件被真正觸發。這基於前面 ProcessPostData 方法中標注出回發的值的差異。當有多個 changed 事件被觸發時,其先後順序是沒有保證的。

下面是 RaisePostBackEvent 方法。僅用於回發,而且是基類實現的私有方法。這是真正提交 form 的方法,除非是 postback。比如按鈕,或者其他通過 Javascript 提交的控件被觸發。如果使用了 Validators, 如沒有手動調用 Validate 方法,這時也已經被調用了。有時候 IE 的 bug 會使得表單被提交,而不引發事件。

接著是 OnPreRender 方法。這通常是在被繪制到浏覽器之前,要更改 page 及其子控件的最後機會。你也可以在這裡創建動態控件。但這時只能捕獲 ViewState, 而不能接受 posted values, 而且沒有事件。因為上面提到的 IE 的 bug, 這裡可以用來捕獲沒有觸發事件的 post back.

保存和繪制(Save and Render)

下一個是 SaveVIEwState 方法。 不管是否 post back. 遞歸的應用到每一個子控件。VIEwState 一般保存所有和 ASPx 頁面裡不一樣的屬性,不管是被代碼還是用戶更改的。注意,由於控件的值是通過他們在控件樹中的位置來保存的,所以如果在這之後添加動態控件到錯誤的位置, VIEwState 可能會崩潰。

下面是 SavePageStateToPersistenceMedium 方法。它真正的保存 page 的 VIEwState. 這個方法可覆蓋。如果重寫的話,注意這裡由於 ASP.Net 的 bug, 需要手工設定一下 __VIEWSTATE,哪怕是空值。

接著是 Render 方法。它遞歸的調用到每個子控件,真正的繪制各自的 html, 發送到浏覽器。在一些頁面模板方案中,常常在這裡添加通用的 header 和 footer. 而不用使用服務器控件。 注意在這裡能作的更改必須是純的 Html. 因為這時候控件都已經繪制完了。

最後是 OnUnload 方法。它調用了 Dispose 方法。這個方法可以用來清理頁面中使用的非托管資源。特別是類似於關閉打開的文件或數據庫連接等。該方法只有當頁面已經被發送到客戶端浏覽器後才發生。所以它只能對服務端的對象起作用。所以他不能在 page 的 trace 中被顯示。

上面就是 page 的生命循環。每次有一個新的請求時,以上過程就重復一次。

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved