下面是ASP.NET頁面初始的過程:
1. Page_Init();
2. Load ViewState;
3. Load Postback data;
4. Page_Load();
5. Handle control events;
6. Page_PreRender();
7. Page_Render();
8. Unload event;
9. Dispose method called;
下面對其中的一些過程作下描述:
1. Page_Init();
這個過程主要是初始化控件,每次頁面載入執行這個初始過程,包括第一次和以後的Postback(這裡說下Postback,其實就可以簡單理解成用戶點擊SUBMIT按鈕之類的,把表單<Form>提交給服務器,這就是一次postback),在這裡面可以訪問控件,但是這裡面的控件值不是我們期待的控件裡面的值,他只是一個控件的初始值(默認值),舉例: 比如一個TextBox1,我們填入了”哈哈”,在點擊SUBMIT提交了頁面後,在Page_Init()裡面,我們訪問到的TextBox1.Text不是我們的”哈哈”,而是開始的”"空字符串,如果TextBox1在我們設計的時候提供了默認值,這裡訪問到的也就是提供的默認值,為什麼呢,這就要看下一個過程了.
對應的事件Page.Init
2. Load ViewState
這個過程是載入VIEWSTATE和Postback數據,比如我們上面的TextBox1,這時就賦了”哈哈”,所以,在Post_Init()對控件賦值是無意義的,它都會在這個過程裡被改寫,當然第一次頁面載入例外,因為沒有VIEWSTATE數據。
沒有對應的事件
3.Load Postback data;
上面說了,Postback可以理解成用戶提交表單數據,所以這裡就是處理表單數據,當然這裡要設計到控件的設計,一般情況不會要我們自己處理這個過程,我們暫且略過. (在以前那篇關於ASP.NET頁面生命周期的簡單描述中,把這個過程和Load ViewState放在了一起,其實那是微軟提供的生命周期過程,這裡單獨提出來是為了讓大家明白這是一個單獨的過程)
沒有對應的事件
4. Page_Load();
這個過程也是每次頁面載入時一定會執行的,但是注意和Page_Init的區別,上面已經涉及了,這裡注意的是一般都會用到Page.IsPostBack,該值指示該頁是否正為響應客戶端回發而加載,或者它是否正被首次加載和訪問。
復制代碼 代碼如下:
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
//第一次執行的CODE HERE
}
else
{
//用戶提交FORM(即Postback)CODE HERE
}
//每次這裡的都回執行CODE HERE
}
對應的事件Page.Load
5. Handle control events;
這個過程裡,相應具體的控件事件,比如private void ListBox1_SelectedIndexChanged(object sender, System.EventArgs e)事件等等
沒有對應的事件(我們自己的事件函數都包括在這個過程裡比如上面的ListBox1_SelectedIndexChanged)
6. Page_
預先呈遞對象,這裡是在向用戶程序呈現數據的倒數第二步,我估計提供這個過程的意義,也就是在這裡能對控件屬性等等要呈現給用戶的數據進行修改,這也是最後的修改,以前的修改(比如在Page_Init裡面)都可能被覆蓋.做完這了還會進行一個操作就是保存狀態,即SaveViewState.
對應的事件時Page.PreRender
7. Page_Render();
大家可以在浏纜器裡View->Source查看到,每個頁面都有一個隱藏的<input>,這裡面的”__VIEWSTATE”就是我們服務器寫回來的頁面狀態信息,在這個之前,服務器要呈現頁面(也就是構造HTML格式的文件),就是從這個”__VIEWSTATE”裡面獲取的數據,當然大家也注意到了,這裡有個Page.Render事件,我們可以添加自己的處理代碼,也就是說我們又可以更改數據,不過這裡推薦不要在這裡修改,既然提供了PreRender,就應該在裡面做最後的修改,當然這不是必須的,只是推薦!
對應的事件Page.Render
8. Unload event;
大家應該明白,當想服務器請求一個對象的時候,就會在內存裡生成一個繼承頁面對象,也就是頁面的類,它繼承自System.Web.UI.Page.
當頁面對象從內存中卸載時發生,將觸發該事件.
對應的事件Page.Unload
9. Dispose method called;
銷毀所有的對象.當從內存釋放Page時發生,這是生存期的最後階段。可能第8和9似乎有些模糊,不過我也沒怎麼搞清楚,待研究!
對應的事件Dispose
以上就是ASP.NET頁面周期的描述。
注意上面灰色背景的文字,如果一個過程中有對應的事件,我們可以自己定義一個函數(當然先在MSDN中找到函數原型),然後在
InitializeComponent中向事件的鏈表上添加上去,像下面:
復制代碼 代碼如下:
private void InitializeComponent()
{
this.Unload += new System.EventHandler(this.MainWebForm_Unload);
this.Load += new System.EventHandler(this.Page_Load);
this.Init += new System.EventHandler(this.Page_Init);
this.PreRender += new System.EventHandler(this.My_PreRender);
}
對於幾個沒有對應事件的過程,比如2.Load ViewState,我們可以重載Page的虛函數protected override void LoadViewState(object savedState);來添加自己的控制代碼,不過切忌掉用基類的對應方法,比如:
復制代碼 代碼如下:
protected override void LoadViewState(object savedState)
{
//自己處理VIEWSTATE
base.LoadViewState (savedState);
}