sessionPageState與視圖狀態存儲

這個配置節甚是簡單,在MSDN中的介紹也甚是簡單:爲 ASP.NET 應用程序配置頁的視圖狀態設置。 web

historySize的做用是設置要存儲在頁歷史記錄中的項數。 瀏覽器

可是這根本是看不明白他是幹嗎的,百度上一大串都是單純說說配置節的意思,根本沒再進一步闡述他的做用,我就不信其餘人都懂了。還好有谷歌。看了一些老外的闡述,不少看不懂,還好有一篇好像懂它是個啥意思,就以那篇做爲切入點。這個配置節是跟ViewState有關係的。 緩存

默認狀況下ViewState是保存在頁面中的,在ASP.NET可使用SessionPageStetePersister類來把ViewState保存到Session裏面。這樣有利於保護ViewState同時也能夠減小頁面的大小。PageStatePersister是一個抽象類,他有兩個子類: 服務器

HiddenFieldPageStatePersister:用一個隱藏域來記錄PageState,默認是使用這個子類 session

SessionPageStatePersister:使用一個Session裏面的變量來記錄PageStete。 spa

因此正常狀況下對sessionPageState配置是看不出任何效果的,必須經過自定義一個PageAdapter,重寫GetStatePersister()方法讓其返回一個SessionPageStatePersister。 3d

或者單純在頁面的隱藏代碼裏面重寫PageStatePersister屬性 blog

那下面經過一個試驗來證實這個historySize的做用,默認值是 隊列

可是這個值太大了,我把它設得小一點 ip

而後在Page_Load方法中添加如下代碼

大概解釋一下就是頁面第一次加載的時候會把lb1標籤的背景顏色設置成紅色,後面的代碼是閱讀了SessionPageStatePersister源碼後發現的,如今是把Session的ViewState的鍵值取出來。下面的幾幅截圖查看運行 的效果:

第一次請求Session裏面沒有存放ViewState

在第一個文本框輸入一個1以後點擊button提交,響應的頁面以下,Session裏面存放了一個ViewState,並特別關注一下第一個key,__SESSIONVIEWSTATE8d41061dff4faae

如此類推在後面的文本框輸入234

   

此時發現就算再提交多少次,Session裏面存的ViewState也只是3個,這就是咱們改配置historySize所達到的效果,就是官網上所說的存儲在頁歷史記錄中的項數。那接下來點擊瀏覽器的回退按鈕3次,因爲瀏覽器的緩存能夠看到頁面貌似回覆到以前狀態,第二次提交時,Session裏面只存了一個ViewSate,當時在文本框輸入了2。

可是服務端上面的Seesion中已經丟棄頁面中__SESSIONVIEWSTATE8d41061dff4faae對應的ViewState。猜測一下此時再點擊button提交後會有什麼效果

紅色背景消失了。那下面就解答一下這個現象的緣由。紅色背景是隻由於非PostBack的時候給lb1設置的屬性,後面再屢次提交時仍然保留是由於ViewState的做用保留了這個紅色背景的設置。正常狀況下不管發多少次PostBack請求(或者是提交)這個狀態仍然會保留,可是點擊了瀏覽器的回退按鈕時就不同了。它回退次數超過historySize時,再提交就會使得頁面中的某些視圖的狀態與理想中的不一致,其緣由是當前頁面提交時會包含當前頁面ViewState的一個key到服務器,經過這個key能夠在Session裏面把ViewState找出來,可是萬一Session裏面已經不包含提供的key對應的ViewState時,一些以前對視圖設置的記錄則會丟失,如上面把lb1的背景色設成紅色。這個應用場景是怎麼樣如今也想不出來,像這種後退再提交的操做也通常不怎麼會出現吧。若是遇到相關的問題時,但願是知道因爲這個緣由引發的。

另外補充記錄一下ViewState在Session中的存儲結構
在Session中有個固定鍵「__VIEWSTATEQUEUE」存儲的隊列,該隊列裏面存着一系列以"__SESSIONVIEWSTATE"做爲前綴的字符串,這些字符串就是各個ViewState存在Session的鍵。經過這些字符串從Session中取出的值就是對應的ViewState了。

   

參考文章

Persisting Page State in ASP.NET 2.0

http://www.4guysfromrolla.com/articles/011707-1.aspx

   

How to remove ViewState from ASP.NET web page and save in Session using SessionPageStatePersister

http://dailydotnettips.com/2011/04/28/how-to-remove-viewstate-from-asp-net-web-page-and-save-in-session-using-sessionpagestatepersister/

相關文章
相關標籤/搜索