一、定義
頁面生存周期 是指 一個ASP.NET頁面類型對象從初始化到銷毀經過的步驟。
一旦某個請求對應到一個ASP.NET頁面時,一個直接或間接繼承自 System.Web.UI.Page 類型的對象會開始初始化
並且開始執行頁面生存周期中的所有步驟。
這個對象就是用戶端請求的ASP.NET頁面的後台Managed 程式碼
可在頁面<%@ page /%>指令中加Trace屬性
PreInit Init InitComplete
LoadState ProcessPostDate PreLoad Load ProcessPostData
ChangedEvents PostBackEvent
SaveState SaveStateComplete Render
二、各步驟的功能
1).初始化
PriInit、Init和 InitComplete
功能: 初始化類對象、初始化主題首頁面、判斷是否是第一次訪問等
2).載入資料和頁面
LoadState、ProcessPostDate、PreLoad、Load、ProcessPostData(第二次)等
首先從頁面回傳的資料載入 ViewState對象, 所有的資料以 Base 64 編碼隨頁面傳入伺服器
然後開始處理回傳的資料,也就是把表單中的 鍵/值 對存入對象之中
隨後開始載入頁面,程式員通常會在這裡做一些初始化的編程,例如 OnLoad事件中編寫頁面初始化代碼
最後再次執行ProcessPostData,以處理Load時新添加的資料。
3).觸發事件
包含了 ChangedEvents 和 PostBackEvent步驟。
首先比較 ViewState 中的資料 和 頁面上一次回傳的資料,以發現有哪些事件需要被觸發,這裡事件是被逐一觸發
的,其順序無法確定
4).儲存狀態並呈現頁面
SaveState SaveStateComplete Render步驟
首先,頁面會編碼儲存所有的 ViewState資料
然後,將其嵌入到頁面的一個隱藏控制項中
接著,轉換所有的控制項標籤並產生頁面HTML,並且發送回用戶端
三、ViewState機制
1).概述
ASP.NET 伺服器控制項 從 System.Web.UI.Control(定義由所有 ASP.NET 伺服器控制項共用的屬性、方法和事件) 繼承名為 ViewState唯讀屬性,使之加入了狀態管理機制。利用之擷取狀態資訊的字典,這些資訊使您可以在同一頁的多個請求間儲存和還原伺服器控制項的檢視狀態 ViewState的類型是 System.Web.UI.StateBag, 它是 儲存 鍵/值 對的字典。
2).ViewState的實現機制
簡單來說,每次伺服器發送給用戶端的頁面中都隱藏了一個資料,該資料用以儲存ViewState。當用戶端再次提交表單時,ViewState就會又隨這表單一起提交到伺服器端,迴圈往複就達到了持續儲存資料的功能。
步驟
客戶申請一個新的帶有 ViewState 欄位的頁面,第一次申請時 ViewState欄位內資料為空白
客戶提交表單,ViewState欄位作為表單的一部分被提交,此時為空白
伺服器從表單中讀取 ViewState的資料,解碼解密,並且存入 ViewState 對象中,第一次仍然為空白
伺服器處理完表單資料後,把表單資料相應寫入 ViewState 對象,這時 ViewState對象就有值了
伺服器把 ViewState 對象加密並編碼,然後寫入頁面的 ViewState 欄位。 此時頁面 ViewState 欄位就包含了
上次提交的表單內的控制項資料和伺服器代碼寫入ViewState的資料
伺服器把頁面發還給用戶端,用戶端得到了 ViewState資料
因為 Page類繼承自 TemplateControl類,而TemplateControl類又繼承自 Control類,故可以直接使用 ViewState屬性。
這一功能在關閉 控制項的 ViewState之後 極其有用。
using System;using System.Data;using System.Configuration;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;public partial class _Handler:System.Web.UI.Page;{ protected void Page_Load(Object sender, EventArgs e) { if(!Page.IsPostBack) { //初始化Value值 ViewState["VALUE"]=0; Output(); } } protected void GO_Click(object sender, EventArgs e) { //使Value值自增1 ViewState["VALUE"]=(int)ViewState["VALUE"]+1; Output(); } private void Output() { //呈現 OUTPUT為頁面的asp:Label控制項 Output.Text=ViewState["VALUE"].ToString(); }}
3). 實質
asp:Label 控制項 實質是System.Web.UI.WebControls.WebControl.Label 它是一個類。由於 WebControl 類繼承自
System.Web.UI.Control類,而 Control 類擁有 ViewState 屬性。 故實質為 使用 ViewState 機制的類。
查看返回頁面的原始碼一般看到類似如下的一個input
其中 value值 使用 BASE64編碼的。 value值 實質為XML檔案,儲存了 所有了 ViewState對象。
<input type=”hidden” name=”_EVENTVALIDATION” id=”_EVENTVALIDATION” value=”/wEWAgK+heeOALZ767wDFMnBmL0VTVt5dZTfeWG6RrWb7b7jc”/>
而 asp:Textbox 控制項 則是直接 實現 <input type=”hidden” /> 機制,不受 ViewState機制影響