ASP.NET ViewState簡要分析


       寫於2013年3月21日 星期四 夜

       第一次知道ViewState這個名詞,是從學校畢業兩年以后。在學校做的項目都是只關注實現效果,不關心實現原理。可是,隨着學習的深入,很多人都有相同的感受,就是越發學習,越發感覺自己什么都不會。個人感覺,這實際上是學習的一個過渡期。當然處於這個階段的人,必須能禁得起孤獨和煎熬,那么成功便也指日可待了。

      下面切入正題,viewState是asp.net中狀態保持方案的一種,並且是客戶端的狀態保持方案。

       說到這里,我們先來看下:客戶端狀態保持方案和服務器端狀態保持方案主要有哪幾種?

  客戶端狀態保持方案:

    01. viewState

   02. HiddenField

   03. Cookies

   04. ControlState

   05. Querystring

     客戶端狀態保持方案本質上有3種:隱藏域/Cookies/QueryString

服務器端狀態保持方案:

   01. Session

   02. Application Object

   03. Caching

   04. Database

今天咱們主要探討viewState

     Viewstate:Asp.NET的.aspx頁面特有的,屬於頁面級的對象。也就是說   只能在本頁面上使用viewState。就是在頁面上的一個隱藏域中保存客戶端單獨使用的數據的一種方式;在ASP.NET中,非單值服務器端控件的值都自動保存在ViewState中。說白了,viewstate我們再頁面中式無法看到的,隱藏域就是viewstate用來保存視圖狀態的容器。

      由於文本框是單值控件(只能存儲單個值),所以不會保存到viewState中,文本框的值仍然能保留使用的其他狀態保持方式。那么哪些控件的狀態不在viewState中保存呢?其實我們可以用一句話來總結,就是單值表單元素的值不使用ViewState保存狀態。例如文本框,原因是文本框的值在有了name屬性后可以被post到服務器上,所以沒有必要使用viewState來保存狀態。我們日常看到的控件 ,比如:GridView的狀態保持就是通過viewState來完成的。簡單來說,當頁面回發時,GridView中數據依然存在的原因,就是由於GridView默認開啟了viewState,而viewState中記錄了GridView的控件名稱等信息,服務器端經過一系列處理后,根據記錄的GridView控件名稱等信息將數據還原到GridView中,並且在頁面的隱藏域中也做了相同的記錄。當客戶端通過post方式向服務器發送請求時,會攜帶着viewState,服務器在接收到用戶請求的頁面后,會自動在請求體中查找是否包含名稱為_viewState的隱藏域,如果有,則將中間的值解碼后添加到頁面的viewState屬性中。

使用viewState前提:

使用viewState的前提是頁面上必須有一個服務器端標記

<form runat=”server” >否則,viewState就無從談起。

Viewstate適用於同一個頁面在不關閉的情況下多次與服務器交互。

ViewState相關事件概述

說起這個,咱們就要從頁面的生命周期談起。

頁面生命周期(頁面生命周期的一部分):

1,       創建頁面類對象

2,      調用頁面類的processrequest方法

3,      LoadAllState():加載視圖狀態

4,     Load

5,    SaveAllState():保存視圖狀態

6,   Render()方法,顯示控件

看了這么多的文字,是否有點枯燥,下面我們來看一張圖。

圖解viewState


文章的最后,我們來看下如何禁用viewState

ViewState禁用方法:

1,         禁用單個ViewState設定EnableViewState=false,禁用ViewState后TextBox不受影響,因為input的value不依靠viewState

2,         禁用整個頁面的viewState,在aspx的Page指令區域加上EnableViewState=”false”。

3,         當某些控件的某些屬性不屬於瀏覽器表單的提交范圍時,.NET FrameWork會把這些屬性添加到ViewState中保存。

4,         WebForm的IsPostBack就是依賴於_viewState實現的。

好了,今天對ViewState的探討就到這里。也希望大鳥對我的文章知識點提出寶貴意見。畢竟能力有限,歡迎交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM