• ASP.Net
  • 常用語法介紹
  • ViewState
  • import_contacts ViewState 檢視狀態概觀
    1322
適用範圍

檢視狀態是一種方法,供 ASP.NET 網頁架構用來保留來回存取之間網頁和控制項的值。

實用性:
重要性:

ViewState 檢視狀態

背景

Web 應用程式沒有狀態 (Stateless)。每次伺服器要求網頁時,都會建立 Web 網頁類別的新執行個體。這通常表示在每次來回存取時,網頁的所有資訊及其控制項都會遺失。例如,根據預設,當使用者在 HTML Web 網頁的文字方塊中輸入資訊時,這項資訊就會傳送至伺服器。但是伺服器在回應時,卻不會將這項資訊傳回瀏覽器。
為了克服這個 Web 程式設計的固有限制,ASP.NET 網頁架構會包括數個狀態管理功能,以保留來回存取 Web 伺服器之間網頁和控制項的值。其中一個功能為檢視狀態。如需詳細資訊,請參閱 ASP.NET 狀態管理概觀。
根據預設,ASP.NET 網頁架構會使用檢視狀態,以保留來回存取之間的頁面和控制項值。轉譯網頁的 HTML 時,在回傳期間必須保留的頁面目前狀態和值都會序列化成 base64 編碼的字串。然後這些字串就會放入頁面的一個或多個隱藏欄位中。
您可以使用頁面的 ViewState 屬性,存取程式碼中的檢視狀態。ViewState 屬性是包含索引鍵/值組的字典,該索引鍵/值組包含檢視狀態資料。
檢視狀態資訊會序列化為 XML,然後使用 base64 編碼進行編碼,而這麼做便會產生大量的資料。當網頁傳送至伺服器時,會將檢視狀態的內容做為網頁回傳資訊的一部分傳送。如果檢視狀態包含大量資訊,則其可以影響網頁的效能。
您可以針對自己的應用程式使用一般資料來測試網頁的效能,以判斷檢視狀態的大小是否會造成應用程式的效能問題。

檢視狀態的使用考量

檢視狀態為特定 ASP.NET Web 網頁提供狀態資訊。如果您必須在多個網頁上使用資訊,或必須在造訪網站後仍然保留資訊,就必須應使用其他方法維護狀態。您可以使用應用程式狀態、工作階段狀態或設定檔屬性。
另一個考量是,如果隱藏欄位中的資料量變得很大,某些 Proxy 和防火牆會防止包含這些資料的網頁存取。因為允許的最大資料量可能會因不同的防火牆和 Proxy 實作而有所不同,所以大型隱藏欄位會產生斷斷續續的問題。如果儲存在 ViewState 屬性中的資料量超過頁面的 MaxPageStateFieldLength 屬性所指定的值,則該頁面會將檢視狀態分割為多個隱藏的欄位。這麼做能減少個別隱藏欄位的大小,使其低於防火牆會拒絕的大小。 某些行動裝置完全不允許隱藏欄位。因此,檢視狀態將不會在這些裝置上運作

您可以在檢視狀態中儲存下列型別的物件:

  • 字串
  • 整數
  • Boolean 值
  • Array 物件
  • ArrayList 物件
  • 雜湊表
  • 自訂型別轉換子 (Type Converter)

 

info 若要使用 ViewState 屬性,則 ASP.NET 網頁必須具有包含 runat="server" 屬性的 form 項目。

ViewState 方法

C# 方法
List mylist = new List();

mylist.Add("item1");

mylist.Add("item2");

ViewState["變數"] = mylist;

mylist = (List)ViewState["變數"];

foreach (string str in mylist)

{

Response.Write(str + "<br />");

}
VB 方法
Dim Val As String = "aaa"

ViewState("變數1") = "aaa"

ViewState("變數2") = "bb"

ViewState("變數3") = "cc"

If Val = ViewState("變數1") Then

   Response.Write(ViewState("變數1"))

ElseIf Val = ViewState("變數2") Then

   Response.Write(ViewState("變數2"))

ElseIf Val = ViewState("變數3") Then

   Response.Write(ViewState("變數3"))

End If