asp.net常規頁生命週期階段列表和事件列表

iDotNetSpace發表於2009-04-02
當我們使用asp.net開發網站,每執行一個頁面,這個頁面都將經歷一個生命週期。瞭解頁的生命週期非常重要,因為這樣我們才能在合適的生命週期編寫程式碼實現預期效果。網上有一句話概括非常精闢:"Do the right thing at the right time in the right place."。微軟的文件給出的ASP.NET生命週期如下:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt1 Page Request  --頁面請求
2 Start  --開始
3 Page Initialization --頁初始化
4 Load  --載入
5 Validation --驗證
6 Postback event handling --回發事件處理
7 Rendering --呈現
8 Unload  --解除安裝
一、生命週期階段列表
下面來看看每個階段對應的具體說明:
1、頁請求
頁請求發生在頁生命週期開始之前。使用者請求頁時,asp.net將確定是否需要分析和編譯頁,或者是否可以在不執行頁的情況下,傳送快取版本以進行響應。
2、開始
在開始階段,將設定頁屬性,如Request和Response。在此階段,頁還將確定請求是回發請求還是新請求,並設定ispostback屬性。此外,在開始階段期間,將設定頁的UICulture屬性。
3、頁初始化
該階段,可以使用頁中的控制元件,並將設定每個控制元件的UniqueID屬性。此外,任何主題都將應用於頁。如果當前請求是回發請求,則回發資料尚未載入,並且控制元件屬性值尚未還原為檢視狀態中的值。
4、載入
該階段,如果當前請求是回發請求,則將使用從檢視狀態和控制元件狀態恢復的資訊載入控制元件屬性。
5、驗證
在驗證期間,將呼叫所有驗證控制元件的Validate方法,此方法將設定各個驗證程式控制元件和頁的IsValid屬性。
6、回發事件處理
如果請求是回發事件,則將呼叫所有事件處理程式。
7、呈現
在呈現期間,檢視狀態將被儲存到頁,然後頁將呼叫每個控制元件,以將其呈現的輸出提供給頁的Response屬性的OutPutStream。
8、解除安裝
完全呈現頁將頁傳送至客戶端並準備丟棄時,將呼叫解除安裝。此時,將解除安裝頁屬性如Request,Response等,並進行清理。
二、生命週期事件列表(常見)
1、Page_PreInit
典型應用:
  使用IsPostBack屬性確定是否是第一次處理該頁;
  建立或者重新建立動態控制元件;
  動態設定母版頁;
  動態設定Theme屬性;
  讀取或者設定配置檔案屬性值。
注意:如果請求是回發請求,則控制元件的值尚未從檢視狀態還原。如果在此階段設定控制元件屬性,則值可能會在下一階段被改寫。
2、Page_Init
典型應用:
  讀取或初始化控制元件屬性
3、Page_Load
典型應用:
  讀取或更新控制元件屬性
4、Controlevents
典型應用:
  執行特定於應用程式的處理:
        如果頁包含驗證程式控制元件,則在執行任何處理之前堅持頁和各個驗證控制元件的IsValid屬性;
        處理特定事件,如Button的Click事件
5、Page_PreRender
典型應用:
  對頁的內容進行最後更改
6、Page_Unload
典型應用:
  執行最後的清理工作,可能包括:
        關閉開啟的檔案和資料庫連線;
        完成日誌記錄或其它特定於請求的任務。
  這個事件裡要注意:因為在解除安裝階段,頁及其控制元件已被呈現,因此無法對響應流做進一步更改。如果嘗試呼叫方法如Response.Write方法,則該頁會引發異常。
好了,最後來一個經典的程式碼例項來回顧一下前面講的主要內容。Code is cheap。看程式碼了:
asp.net常規頁生命週期階段列表和事件列表
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtusing System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

/// 
/// 新建一個aspx頁面,名稱Default.aspx
/// 
public partial class Default : System.Web.UI.Page
{
    
protected void Page_PreInit(object sender, EventArgs e)
    {
        Response.Write(
"Page_PreInit
");
    }
    
protected void Page_Init(object sender, EventArgs e)
    {
        Response.Write(
"Page_Init
");

    }
    
protected void Page_InitComplete(object sender, EventArgs e)
    {
        Response.Write(
"Page_InitComplete
");

    }
    
protected void Page_PreLoad(object sender, EventArgs e)
    {
        Response.Write(
"Page_PreLoad
");

    }
    
protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(
"Page_Load
");

    }
    
protected void Page_LoadComplete(object sender, EventArgs e)
    {
        Response.Write(
"Page_LoadComplete
");

    }
    
protected void Page_PreRender(object sender, EventArgs e)
    {
        Response.Write(
"Page_PreRender
");

    }
    
protected void Page_SaveStateComplete(object sender, EventArgs e)
    {
        Response.Write(
"Page_SaveStateComplete
");

    }

   
    
/// 
    
/// 因為在解除安裝階段,頁及其控制元件已被呈現,因此無法對響應流做進一步更改。如果嘗試呼叫方法如Response.Write方法,則該頁會引發異常。
    
/// 
    
/// 
    
/// 
    protected void Page_Unload(object sender, EventArgs e)
    {
        
int i = 0;
        i
++;//這行程式碼是用來設定斷點的,為什麼不用Response.Write? *****

    }


    
protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text 
= "ControlEvent";
        Response.Write(
"Button事件觸發!
");
    }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-580654/,如需轉載,請註明出處,否則將追究法律責任。

相關文章