標籤:

Asp.net中的ViewState用法

Session,ViewState用法

基本理論:

session值是保存在伺服器內存上,那麼,可以肯定,大量的使用session將導致伺服器負擔加重.而viewstate由於只是將數據存入到頁面隱藏控制項里,不再佔用伺服器資源,因此,我們可以將一些需要伺服器"記住"的變數和對象保存到viewstate裡面.而sesson則只應該應用在需要跨頁面且與每個訪問用戶相關的變數和對象存儲上.另外,session在默認情況下20分鐘就過期,而viewstate則永遠不會過期.

數據類型:

但viewstate並不是能存儲所有的.net類型數據,它僅僅支持String、Integer、Boolean、Array、ArrayList、Hashtable以及自定義的一些類型.

其他考慮

當然,任何事物都有兩面性,使用viewstate會增加頁面html的輸出量,佔用更都的帶寬,這一點是需要我們慎重考慮的.另外,由於所有的viewstate都是存儲在一個隱藏域裡面,用戶可以很容易的通過查看源碼來看到這個經過base64編碼的值.然後再經過轉換就可以獲取你存儲其中的對象和變數值.

其實,對於viewstate的安全性問題,asp.net還給我們提供了更多的選擇.一般如果要保護viewstate有兩種方式:一種是防篡改,一種是加密.一說到防篡改,我們就想起了使用散列代碼.沒錯,我們可以在頁面頂部加入如下代碼:PageEnableViewStateMAC=true。這樣asp.net就會自動的在viewstate中追加一個散列碼,在頁面回傳時,伺服器根據回傳的viewstate生成一個散列碼,再與回傳的散列碼相比較,如果不對,則丟棄該viewstate,同時控制項將恢復初試狀態.(默認情況下asp.net是通過SHA1演算法而不是md5演算法來生成散列,不過這個可以在machine.config裡面配置machineKeyvalidation="MD5"即可),而viewstate加密就更簡單了,只要在machine.config里設置一下machineKeyvalidation="3DES"即可實現用des加密viewstate了.

使用方法

怎麼在客戶端,存取ViewState?

應用環境

一些與安全性無關,數據量較小,需要長時間操作的參數,應該用ViewState存取。

在webgis中,地圖的各種相關狀態,如zoom,center,layers,visibility等,用viewstate存取的話,就不存在session過期的問題,網頁可以永遠使用,甚至可以下載保存,在進行地圖請求,或iframe到第三方的應用中。

Asp.net中的ViewState用法昨天看到一個文章,作者在自己的頁面中定義了幾個全局變數,類型是static,但是這樣的定義會存在問題,當一個用戶訪問的時候不會有問題,但是當大量用戶並發訪問系統的時候,頁面中的這些static類型的全局變數就會出現問題了,然後作者改用了Session變數保存以前由static類型全局變數紀錄的數據,因為Session是狀態量,只是和某個訪問進程相關,這樣就不會出現由於static類型引起的問題了。

但是這樣的話系統中的Session就太多了,我總認為這樣不太好,雖然每個一個Session都有一個ID不會衝突。ASP.NET引入了ViewState,可以記錄同一個頁面的不同PostBack中的一些數據值。

所以我的解決方法是:使用例如ViewState["name"]這樣的形式記錄以前static的全局變數,這樣就可以避免這個問題了,因為我的系統是在區域網使用的,ViewState帶來的多餘的數據量可以忽略不計了。

asp.net ViewState用法:

ASP.NET中的ViewState是ASP.NET中用來保存WEB控制項回傳時狀態值一種機制.在WEB窗體(FORM)的設置為runat="server",這個窗體(FORM)會被附加一個隱藏的屬性_VIEWSTATE._VIEWSTATE中存放了所有控制項在ViewState中的狀態值.

ViewState是類Control中的一個域,其他所有控制項通過繼承Control來獲得了ViewState功能.它的類型是system.Web.UI.StateBag,一個名稱/值的對象集合.

當請求某個頁面時,ASP.NET把所有控制項的狀態序列化成一個字元串,然後做為窗體的隱藏屬性送到客戶端.當客戶端把頁面回傳時,ASP.NET分析回傳的窗體屬性,並賦給控制項對應的值.當然這些全部是由ASP.NET負責的.

定義ViewState屬性

Public int PageCount

{

get{return(int)ViewState["PageCount"];}

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

}

使用ViewState的條件

如果要使用ViewState,則在ASPX頁面中必須有一個伺服器端窗體標記(<formrunat=server>).窗體欄位是必需的,這樣包含ViewState信息的隱藏欄位才能回傳給伺服器.而且,該窗體還必須是伺服器端的窗體,這樣在伺服器上執行該頁面時,ASP.NET頁面框架才能添加隱藏的欄位.

Page的EnableViewState屬性值為true.

控制項的EnableViewState屬性值為true.

提醒:

1.當存在頁面回傳時,不需要維持控制項的值就要把ViewState禁止.

2.ViewState的索引是大小寫敏感的.

3.ViewState不是跨頁面的.

4.為了能包存在ViewState中,對象必須是可流化或者定義了TypeConverter.

5.控制項TextBox的TextMode屬性設置為Password時,它的狀態將不會被保存在ViewState中,這應該是出於安全性的考慮.

6.在頁面沒有回傳或重定向或在回傳中轉到(transfer)其他頁面時不要使用ViewState.

7.在動態建立控制項時要小心它的ViewState.

8.當禁止一個程序的ViewState時,這個程序的所有頁面的ViewState也被禁止了.

9.只有當頁面回傳自身時ViewState才是持續的.

設置ViewState

ViewState可以在控制項,頁,程序,全局配置中設置.預設情況下EnableViewState為true.如果要禁止所有頁面ViewState功能,可以在程序配置中把EnableViewState設為false.

本文關於:asp.netViewState用法


推薦閱讀:

BBC NEWS | Americas | Viewpoint: The dubious ...
GridView漂亮的樣式
2.4.7ListView的焦點問題 | 菜鳥教程

TAG:View |