瀏覽器與服務器交互信息(序列化與發序列化) 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頁面就有了持續執行的效果。(使用視圖狀態時,對象必須先序列化,然後再通過回傳進行反序列化。

所以上篇博文裏的數據爲何存在就得以解釋了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章