ASP.NET狀態管理之十一(檢視狀態ViewState)

來源:互聯網
上載者:User

檢視狀態是 ASP.NET 頁架構預設情況下用於儲存往返過程之間的頁和控制項值的方法。當呈現頁的 HTML 形式時,需要在回傳過程中保留的頁的目前狀態和值將被序列化為 Base 64 編碼的字串,並輸出到檢視狀態的隱藏欄位中。

檢視狀態是 ASP.NET 頁中的儲存庫,可以儲存需要在回傳過程中保留的值。例如,您可以將資訊儲存在檢視狀態中,下次將頁面發送到伺服器時,將會在頁載入事件程序中訪問這些資訊。
您可以使用頁的 ViewState 屬性(此屬性公開一個字典對象)來訪問檢視狀態資訊。由於檢視狀態資料以字串的形式儲存,因此只能儲存可以序列化的對象。

檢視狀態資料以 Base 64 編碼字串的格式儲存在一個或多個隱藏欄位中。您可以使用頁的 ViewState 屬性(此屬性公開一個字典對象)來訪問檢視狀態資訊。由於檢視狀態資料以字串的形式儲存,因此只能儲存可以序列化的對象。

由於檢視狀態是作為隱藏欄位發送的,因此直到發生 PreRenderComplete 事件之前,都可以對檢視狀態變更。一旦將頁呈現到瀏覽器,便無法儲存對檢視狀態的更改。

如果查看頁輸出源,則可以看到隱藏檢視狀態欄位中的資訊,這可能產生安全性問題。若要緩解該問題,可以通過將 @ Page 指令中的 viewStateEncryptionMode 屬性設定為“Always”來加密檢視狀態。

注意
若要使用 ViewState 屬性,ASP.NET 網頁必須包含具有 runat="server" 屬性的表單元素。

 

 

可以儲存在檢視狀態中的資料類型
您可以將下列類型的Object Storage Service到檢視狀態中:
字串
整數
布爾值
Array 對象
ArrayList 對象
雜湊表
自訂類型轉換器(請參見 TypeConverter 類)
您也可以儲存其他類型的資料,但是必須使用 Serializable 屬性編譯該類,這樣檢視狀態便可以將這些資料序列化為 XML。

 

使用檢視狀態的注意事項
檢視狀態提供了特定 ASP.NET 頁的狀態資訊。如果需要在多個頁上使用資訊,或者如果需要在訪問網站時保留資訊,則應當使用另一個方法(如應用程式狀態、工作階段狀態或個人化)來維護狀態。

檢視狀態資訊將序列化為 XML,然後使用 Base 64 編碼進行編碼,這將產生大量的資料。將頁回傳到伺服器時,檢視狀態的內容將作為頁回傳資訊的一部分發送。如果檢視狀態包含大量資訊,則會影響頁的效能。

另一個重要的考慮因素是,如果隱藏欄位中的資料量過大,某些代理和防火牆將禁止訪問包含這些資料的頁。由於最大數量會隨所採用的防火牆和代理的不同而不同,因此大量隱藏欄位可能會導致偶發性問題。為了協助避免這一問題,如果 ViewState 屬性中儲存的資料量超過了頁的 MaxPageStateFieldLength 屬性中指定的值,該頁會將檢視狀態拆分為多個隱藏欄位,以將每個單獨欄位的大小減少到防火牆拒絕的大小以下。

某些行動裝置根本不允許使用隱藏欄位。因此,檢視狀態對於這些裝置無效。

 

從檢視狀態中讀取值
在頁代碼中,設定 ViewState 屬性中變數的值。
下面的程式碼範例說明如何從檢視狀態中擷取名為 arrayListInViewState 的 ArrayList 對象,然後將 GridView 控制項作為資料來源綁定到該對象。
arrayList = new ArrayList();
arrayList = (ArrayList)ViewState["arrayListInViewState"];

this.GridView1.DataSource = arrayList;
this.GridView1.DataBind();

檢視狀態中的值被類型化為 String。如本例所示。在 C# 中,當您閱讀檢視狀態值時,應該始終強制轉換為適當的類型。
如果嘗試從不存在的檢視狀態中擷取值,則不會引發任何異常。若要確保所需的值處於檢視狀態,請首先使用測試(例如以下測試)檢查該對象是否存在:
if (ViewState["color"] == null)
    // No such value in view state, take appropriate action.

 

將值儲存到檢視狀態
下面的樣本示範如何?從其控制項的 ViewState 屬性儲存區和檢索值的 Text 屬性。
private const int defaultFontSize = 3;

// Add property values to view state with set;
// retrieve them from view state with get.
public String Text
{
    get
    {
        object o = ViewState["text"];
        return (o == null)? String.Empty : (string)o;
    }

    set
    {
        ViewState["Text"] = value;
    }
}

加密檢視狀態
在 @ Page 指令中,將 ViewStateEncryptionMode 屬性設定為“Always”,如下面的樣本所示:
<% @Page ViewStateEncryptionMode="Always" ...  %>

 

 

http://aierong.cnblogs.com

Sql Server2005 Transact-SQL 新兵器學習總結之-總結
MS SQLDatabase Backup和恢複預存程序(加強版本)
sql server中分散式查詢隨筆(連結的伺服器(sp_addlinkedserver)和遠程登入映射(sp_addlinkedsrvlogin)使用小總結)
ASP.NET2.0國際化/本地化應用程式的實現總結(多語言,多文化頁面的實現)
WAP開發資料站(最新更新)
自訂格式字串隨筆 (IFormattable,IFormatProvider,ICustomFormatter三介面的實現)
Mcad學習筆記之非同步編程(AsyncCallback 委託,IAsyncResult介面,BeginInvoke方法,EndInvoke方法的使用小總結)
Mcad學習筆記之通過反射調用類的方法,屬性,欄位,索引器(2種方法)
Mcad學習筆記之序列化(2進位和Soap序列化)
Mcad學習筆記之委託再理解(delegate的構造器,BeginInvoke,EndInvoke,Invoke4個方法的探討)
WinForm開發,表單顯示和表單傳值相關知識總結
Mcad學習筆記之Microsoft Windows服務
copy某目錄下的所有的目錄和檔案到目的目錄(目錄數據備份)
ASP.NET狀態管理之一(概括篇)

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.