1. 程式人生 > >瀏覽器與伺服器互動資訊(序列化與發序列化) ViewState

瀏覽器與伺服器互動資訊(序列化與發序列化) ViewState

本篇來解釋上篇博文中使用者輸入資料沒有消失的問題。(由於http協議的無狀態性使得每次頁面請求都會重新建立所有控制元件。即所有的資料都將不復存在)

先來看一下asp.net頁面的生命週期

ASP.NET頁面的生命週期:(詳見ASP.Net4.0權威指南第1章第3節)

1.瀏覽器提出請求

2.頁面框架初始化

    此階段開始建立ASP.net頁面,產生你在.aspx頁面裡面用標籤定義的所有控制元件,此外,如果頁面不是第一次被請求,即只是一次會是回送,ASP.net將反序列化狀態檢視資訊並把它們應用到所有的控制元件上,page_Init事件在這個階段被觸發。

   Page_Init在所有外觀設定後引發,使用該事件來讀取或初始化控制元件屬性。

3.使用者程式碼初始化

4.驗證

5.事件處理

6.呈現

7.清除

再看每次請求頁面時發生的事情:

客戶每次請求頁面時——通過最初請求或者回送——所發生的事情。

由於http協議的無狀態性使得每次頁面請求都會重新建立所有控制元件。即所有的資料都將不復存在,那我們那什麼來互動呢?

ASP.NET 2.0提供了檢視狀態(ViewState)這一項非常重要的技術,它能使得頁面和頁面中的控制元件在從伺服器到客戶端,再從客戶端返回的往返過程中保持狀態資訊。這樣就可以在Web這種無狀態的環境之上建立一個有狀態並持續執行的頁面效果。

檢視狀態的具體執行過程為:每當使用者請求某個.aspx頁面時,.NET框架首先把相關控制元件的狀態資料序列化

成一個字串,然後,將其做為名為__VIEWSTATE的隱藏域的Value值傳送到客戶端。如果頁面是第一次被請求,那麼伺服器控制元件也將是被第一次執行時,名為__VIEWSTATE的隱藏域中只包含控制元件的預設資訊,通常為空或者null。在隨後的回送事件中,ViewState中就儲存了伺服器控制元件在前面回送中可用的屬性狀態。這樣伺服器控制元件就可以監視在當前被處理的回送事件發生之前的狀態了。這些過程是由.NET框架負責的,對使用者來說是執行.aspx頁面就有了持續執行的效果。(使用檢視狀態時,物件必須先序列化,然後再通過回傳進行反序列化。

所以上篇博文裡的資料為何存在就得以解釋了。