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有兩種方式: 一種是防篡改,一種是加密. 一說到防篡改,咱們就想起了使用散列代碼. 沒錯, 咱們能夠在頁面頂部加入以下代碼:Page EnableViewStateMAC=true。這樣asp.net就會自動的在viewstate中追加一個散列碼,在頁面回傳時,服務器根據回傳的viewstate生成一個散列碼,再與回傳的散列碼相比較,若是不對,則丟棄該viewstate,同時控件將恢復初試狀態. (默認狀況下asp.net是經過SHA1算法而不是md5算法來生成散列,不過這個能夠在machine.config裏面配置machineKey validation="MD5"便可),而viewstate加密就更簡單了, 只要在machine.config裏設置一下machineKey validation="3DES"便可實現用des加密viewstate了.
使用方法
怎麼在客戶端,存取ViewState?
應用環境
一些與安全性無關,數據量較小,須要長時間操做的參數,應該用ViewState存取。
在webgis中,地圖的各類相關狀態,如zoom, center, layers, visibility等,用viewstate存取的話,就不存在session過時的問題,網頁能夠永遠使用,甚至能夠下載保存,在進行地圖請求,或iframe到第三方的應用中。html

Asp.net中的ViewState用法   web

   昨天看到一個文章,做者在本身的頁面中定義了幾個全局變量,類型是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用法算法

相關文章
相關標籤/搜索