一、ViewState概述
① ViewState是基于webform的
② 在web窗體控件屬性處設定runat = "server",這個控件會被附加一個隐藏的屬性_ViewState,_ViewState存放了所有控件在ViewState中的狀态值。
③ 頁面會在輸出時,自動添加下面的隐藏域:
value處的值隻是base64編碼并不是加密。
④ ViewState是一個名稱/值的對象集合。
⑤ 當請求某個頁面時,ASP.NET會把所有控件的狀态序列化成一個字元串,然後作為窗體的隐藏屬性送到用戶端,當用戶端将頁面回傳時,ASP.NET分析回傳的窗體屬性,并賦給控件對應的值。(恢複現場)
⑥ ViewState不能存儲所有的資料類型,僅支援:String、Integer、Boolean、Array、ArrayList、Hashtable
二、ViewState原理
① 浏覽器請求Default.aspx頁面。
② 在伺服器端 發現建立的ViewState 這個時候 會自動建立一個名字叫做__VIEWSTATE(雙下滑線 全部是大寫)的隐藏域 其隐藏域的值經過base64加密以後傳回到浏覽器端這一加密過程在頁面生命周期的SaveState事件中的SaveAllState方法中完成。
③ 當浏覽器送出表單的時候 将__VIEWSTATE的隐藏域也一起送出到服務端 這個時候 頁面生命周期的ReadState事件的ReadAllState方法會将加密後的值反base64解密 最後将值指派給名字叫做xx的ViewState。
④ 最後來操作ViewState中的值。
三、使用
1.使用原因
由于http是無記憶無狀态的協定。頁面傳值給伺服器,都是通過form表單,且控件自己必須有name屬性與value才可以得到值。但是像顯示動态資訊很多情況下并不都是使用滿足上述條件的控件,是以需要将http僞裝為有記憶的。而viewstate就是可以事先這個僞裝術的政策。
2.使用方法
① 條件與設定
② 執行個體 aspx.cs檔案:
aspx界面(就一個自增按鈕):
運作效果:
③ 禁用方法
在預設情況下,所有伺服器控件的viewstate開啟狀态,通過以及幾種途徑來禁止。 1.頁面級别
2.控件級别
3.應用程式級别
4.機器級别
頁面級别禁止的方法是在頁面的開始寫入
<span style="font-family:Microsoft YaHei;"> <% @ Page EnableViewState = " False " %>
or
<% @ Page EnableViewState = " True " %></span>
控件級别是
<span style="font-family:Microsoft YaHei;"> < asp:TextBox id = " txtCode " runat = " server” EnableViewState= " false " />
or
< asp:TextBox id = " txtCode " runat = " server " EnableViewState = " true " /></span>
也可以直接在控件處修改
程式級别是在web.config中
<span style="font-family:Microsoft YaHei;">< pages enableViewState = " false " />
or
< pages enableViewState = " true " />
</span>
機器級别是在machine.config中
<span style="font-family:Microsoft YaHei;"> < pages enableViewState = " true " enableViewStateMac = " true " ... />
or
< pages enableViewState = " false " ... /> </span>
四、補充
1.回憶與直接寫值不同
如果将ViewState禁用後,還是可以在伺服器端給控件text指派的。但是不可回憶(不可還原現場)。通過下面這個執行個體來感受下。
aspx.cs檔案:
界面:
一個label和一個按鈕
運作效果:
2.讀取viewstate中的值都是開始鍵值對捆綁設定好的。如果改鍵未設定值時,讀出來的是空。
對上面使用中介紹的ViewState進行一點改進。
aspx.cs檔案:
界面:
同上
運作效果: