ASP.NET頁面執行順序

來源:互聯網
上載者:User

 

1.對象初始化(OnInit方法)

    頁面中的控制項(包括頁面本身)都是在它們最初的FORM中被首次初始化的。通過在ASPX頁面的後台代碼檔案的構造器中聲明你的對象,頁面將知道對象的類型,並知道需要建立多少個這樣的對象。一旦你在構造器中聲明了你的控制項,你就可以在它的任何子類,方法,事件或者屬性中訪問到它們。但是,如果你的任何對象是在ASPX檔案中指定的控制項,這樣的控制項是沒有屬性的。而且這樣做對從代碼中訪問它們是危險的,因為無法保證這些控制項執行個體是按照怎樣的順序被建立的(假定它們都是能完全被建立的)。初始化事件可以通過OnInit方法重載。

2.載入檢視狀態資料(LoadViewState事件)

   初始化以後,控制項僅能通過ID引用(還沒有建立用於相對參照的文件物件模型)。 在LoadViewState事件中,已初始化的控制項獲得第一個屬性:上一次提交存留到伺服器的檢視狀態資訊。頁檢視狀態通過ASP.NET維護,它被用於在一個往返行程中存留資訊到伺服器。檢視狀態資訊被儲存為一個成對的名稱和數值,它包含控制項的如Text和Value一類的資訊。視圖資訊被儲存在隱藏<input>控制項的值屬性中在頁請求中傳遞。正如你所瞭解的,這是舊的ASP3.0狀態維護技術的一個巨大飛躍。這個事件可以通過LoadViewState方法重載,往往用來在控制項被填充時定製它所接受的資料。

3.處理回傳資料(LoadPostData事件)

    在建立頁的階段,被發送到伺服器端的Form資料(ASP.NET中的術語為回傳資料)依照每個控制項的資料需求進行處理。當頁面提交Form時,架構將在每個提交資料的控制項上實現IPostBackDataHandler介面。頁面然後激發LoadPostData事件,通過頁面解析發現實現了IPostBackDataHandler介面的控制項,並用正確的回傳資料更新控制項狀態。ASP.NET通過匹配控制項的唯一標示符來更新正確的控制項,該標示符具有名稱值集合中的名稱值對。這也就是在所有特定的頁中每個控制項都需要一個唯一標示符的原因之一。其它的步驟都由架構來完成,以確定每個標示符在環境中是唯一的,例如存在於單頁面中的自訂使用者控制項。LoadPostData事件被激發後,RaisePostDataChanged事件就可以隨時被執行了。

4.對象載入(OnLoad方法)

    對象在Load事件中獲得正確的Form。所有的對象首先都被組織在頁DOM(ASP.NET中稱為控制項樹)中,並且很容易通過代碼或者相對位置(crawling the DOM)來引用。然後對象就可以自由的訪問HTML中的用戶端屬性集,例如width,value,或者visibility。載入時,控制項邏輯,如演算法、以編程方式設定控制項屬性、用StringBuilder裝配輸出字串都同時被執行。大部分的工作都是在這一階段完成的。Load 事件能夠通過調用OnLoad來重載。

5.激發RaisePostDataChanged 事件

    如前所述,這發生在所有實現了IPostBackDataHandler介面的控制項被正確的回傳資料更新以後。在這個過程中,每個控制項都有一個布爾值的標識,標識其自上一次提交後該控制項的資料是被更改還是保持原值。然後ASP.NET通過搜尋網頁來尋找任何顯示控制項資料被更改的標識並激發RaisePostDataChanged。RaisePostDataChanged事件直到Load事件發生後,所有控制項被更新後才激發。這保證了在控制項被回傳資料更新前,其它控制項的資料在RaisePostDataChanged事件中沒有被手動更改過。

6.處理用戶端回傳事件(RaisePostBackEvent事件)

   當回傳更新導致資料改變而引發伺服器端事件後,引發回傳的對象會在RaisePostBackEvent事件中被處理。這種激發回傳的對象往往是其狀態改變而引發回傳的控制項(其autopostback被啟用)或者是一個被點擊的表單提交按鈕。很多代碼都在這個事件中執行,因為這是控制事件驅動邏輯的理想位置。為了保證呈現到瀏覽器的資料的正確性,在一系列的回傳事件後RaisePostBackEvent事件最終被激發。基於一致性的考慮,回傳中改變的控制項直到這個函數被執行後才被更新。也就是說,被預期事件改變的資料總是在結果頁反映出來。RaisePostBackEvent事件可以通過RaisePostBackEvent來捕捉。

7.對象預呈現(OnPreRender事件)

   對象被預呈現的地方對於那些能夠儲存到視圖或者維持其檢視狀態的對象來說是最後一次有機會改變的地方。這使得預呈現步驟成為做最後修改的理想位置,例如改變控制項屬性或改變控制項樹結構,不用擔心因為資料庫請求或者檢視狀態更新而導致對象的變化。預呈現階段之後,對象改變被鎖定並且不能再被儲存到頁檢視狀態中。預呈現階段可以通過重載OnPreRender實現。

8.儲存檢視狀態(SaveViewState事件)

   只有在所有的頁面對象的改變都發生後檢視狀態才被儲存。對象狀態資料被儲存在隱藏<input>對象中,這也是對象狀態資料準備呈現到HTML的地方。在SaveViewState事件中,值能夠被儲存到檢視狀態對象中,但頁面控制項的改變並不能儲存到其中。可以通過重載SaveViewState實現這個步驟。

9.呈現HTML(Render事件)

    Render事件通過裝配用於瀏覽器輸出的HTML來著手頁的建立。在Render事件中,頁調用對象使它們呈現為HTML,然後頁收集HTML來發送。當Render事件被重載的時候,開發人員可以為瀏覽器建立定製的HTML,此時頁面建立的任何HTML都還沒有生效。Render 方法用HtmlTextWriter對象作參數並由它產生HTML給瀏覽器。這裡仍然可以作修改,但是這樣的修改只會反映到客戶(譯者註:意即改變只會在HTML呈現中反映而檢視狀態並無法被改變)。Render 事件可以被重載。

10.釋放(Dispose事件)

當頁面的HTML呈現後,對象被釋放。在Dispose事件中,你可以清除任何在頁面建立中構造的對象或者引用。在這裡,所有的處理都已經被執行,你可以安全的釋放任何還存在的對象,包括Page對象。Dispose能被重載。

具體對應的事件順序如下:

①Page_Init()     對象初始化;

②LoadViewState   載入檢視狀態;

③LoadPostData    處理回送資料;

④Page_Load()     頁面載入;

⑤RaisePostDataChanged 資料更新並回送事件;

⑥RaisePostBackEvent    處理用戶端回傳的事件;

⑦Page_PreRender()頁面預先處理;

⑧SaveViewState   儲存檢視狀態;

⑨Page_Render()   呈現Html靜態頁面;

⑩UnLoad          釋放頁面;

總結

每次我們請求一個ASP.NET頁的時候,這個從初始化到釋放的過程都同樣的被執行。通過理解ASP.NET頁的內部執行過程,編寫和調試代碼的時候就會更加容易和高效。

下面是具體的代碼:

view plaincopy to clipboardprint?
using System;  
using System.Data;  
using System.Configuration;  
using System.Web;  
using System.Web.Security;  
using System.Web.UI;  
using System.Web.UI.WebControls;  
using System.Web.UI.WebControls.WebParts;  
using System.Web.UI.HtmlControls;  

public partial class _Default : Page   
{  
    protected void Page_Load(object sender, EventArgs e)  
    {  

    }

    #region OnPreInit 第一步  
    protected override void OnPreInit(EventArgs e)  
    {  
        //檢查 IsPostBack 屬性來確定是不是第一次處理該頁。  
        //建立或重新建立動態控制項。  
        //動態設定主控頁。  
        //動態設定 Theme 屬性。  
        //讀取或設定設定檔屬性值。  
        //注意    
        //如果請求是回傳請求,則控制項的值尚未從檢視狀態還原。如果在此階段設定控制項屬性,則其值可能會在下一事件中被重寫。  
        base.OnPreInit(e);  
    }
    #endregion

    #region OnInit 第二步  
    protected override void OnInit(EventArgs e)  
    {  
        //在所有控制項都已初始化且已應用所有外觀設定後引發。使用該事件來讀取或初始化控制項屬性。  
        base.OnInit(e);  
    }
    #endregion

    #region OnInitComplete 第三步  
    protected override void OnInitComplete(EventArgs e)  
    {  
        //由 Page 對象引發。使用該事件來處理要求先完成所有初始化工作的任務。  
        base.OnInitComplete(e);  
    }
    #endregion

    #region PreLoad 第四步  
    protected override void OnPreLoad(EventArgs e)  
    {  
        //如果需要在 Load 事件之前對頁或控制項執行處理,請使用該事件。   
        //在 Page 引發該事件後,它會為自身和所有控制項載入檢視狀態,然後會處理 Request 執行個體包括的任何回傳資料。  
        base.OnPreLoad(e);  
    }
    #endregion  

    #region OnLoad 第五步  
    protected override void OnLoad(EventArgs e)  
    {  
        //Page 在 Page 上調用 OnLoad 事件方法,然後以遞迴方式對每個子控制項執行相同操作,如此迴圈往複,直到載入完本頁和所有控制項為止。  
        //使用 OnLoad 事件方法來設定控制項中的屬性並建立資料庫連接。  
        base.OnLoad(e);  
    }
    #endregion

    #region 控制項事件 第六步  
    protected void Button1_Click(object sender, EventArgs e)  
    {  
        //用這些事件來處理特定控制項事件,如 Button 控制項的 Click 事件或 TextBox 控制項的 TextChanged 事件。  
        //注意    
        //在回傳請求中,如果頁包含驗證程式控制項,請在執行任何處理之前檢查 Page 和各個驗證控制項的 IsValid 屬性。  

    }
    #endregion

    #region OnLoadComplete 第七步  
    protected override void OnLoadComplete(EventArgs e)  
    {  
        //對需要載入頁上的所有其他控制項的任務使用該事件。  
        base.OnLoadComplete(e);  
    }
    #endregion

    #region OnPreRender 第八步  
    protected override void OnPreRender(EventArgs e)  
    {  
        //在該事件發生前:  
        //Page 對象會針對每個控制項和頁調用 EnsureChildControls。   
        //設定了 DataSourceID 屬性的每個資料繫結控制項會調用 DataBind 方法。有關更多資訊,請參見下面的資料繫結控制項的資料繫結事件。  
        //頁上的每個控制項都會發生 PreRender 事件。使用該事件對頁或其控制項的內容進行最後更改。  
        base.OnPreRender(e);  
    }
    #endregion  

    #region SaveStateComplete 第九步  
    protected override void OnSaveStateComplete(EventArgs e)  
    {  
        //在該事件發生前,已針對頁和所有控制項儲存了 ViewState。將忽略此時對頁或控制項進行的任何更改。  
        //使用該事件執行滿足以下條件的任務:要求已經儲存了檢視狀態,但未對控制項進行任何更改。  
        base.OnSaveStateComplete(e);  
    }
    #endregion

    #region Render 第十步  
    //Render  
    //這不是事件;在處理的這個階段,Page 對象會在每個控制項上調用此方法。所有 ASP.NET Web 伺服器控制項都有一個用於寫出發送給瀏覽器的控制項標記的 Render 方法。  
    //如果建立自訂控制項,通常要重寫此方法以輸出控制項的標記。不過,如果自訂控制項只合并標準的 ASP.NET Web 伺服器控制項,不合并自訂標籤,則不需要重寫 Render 方法。有關更多資訊,請參見開發自訂 ASP.NET 伺服器控制項。  
    //使用者控制項(.ascx 檔案)自動合并呈現,因此不需要在代碼中顯式呈現該控制項。
    #endregion

    #region OnUnload 第十一步         
    protected override void OnUnload(EventArgs e)  
    {  
        //該事件首先針對每個控制項發生,繼而針對該頁發生。在控制項中,使用該事件對特定控制項執行最後清理,如關閉控制項特定資料庫連接。  

        //對於頁自身,使用該事件來執行最後清理工作,如:關閉開啟的檔案和資料庫連接,或完成日誌記錄或其他請求特定任務。  
        //注意    
        //在卸載階段,頁及其控制項已被呈現,因此無法對響應流做進一步更改。如果嘗試調用方法(如 Response.Write 方法),則該頁將引發異常。  
        base.OnUnload(e);  
    }
    #endregion  
}

來自CSDN部落格,轉載自:http://blog.csdn.net/a497785609/archive/2009/09/02/4510335.aspx

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.