這個配置節甚是簡單,在MSDN中的介紹也甚是簡單:為 ASP.NET 應用程式配置頁的視圖狀態設置。 historySize的作用是設置要存儲在頁歷史記錄中的項數。 但是這根本是看不明白他是幹嘛的,百度上一大串都是單純說說配置節的意思,根本沒再進一步闡述他的作用,我就不信其他人都懂了。還好有谷歌。看 ...
這個配置節甚是簡單,在MSDN中的介紹也甚是簡單:為 ASP.NET 應用程式配置頁的視圖狀態設置。
historySize的作用是設置要存儲在頁歷史記錄中的項數。
但是這根本是看不明白他是幹嘛的,百度上一大串都是單純說說配置節的意思,根本沒再進一步闡述他的作用,我就不信其他人都懂了。還好有谷歌。看了一些老外的闡述,很多看不懂,還好有一篇好像懂它是個啥意思,就以那篇作為切入點。這個配置節是跟ViewState有關係的。
預設情況下ViewState是保存在頁面中的,在ASP.NET可以使用SessionPageStetePersister類來把ViewState保存到Session裡面。這樣有利於保護ViewState同時也可以減少頁面的大小。PageStatePersister是一個抽象類,他有兩個子類:
HiddenFieldPageStatePersister:用一個隱藏域來記錄PageState,預設是使用這個子類
SessionPageStatePersister:使用一個Session裡面的變數來記錄PageStete。
所以正常情況下對sessionPageState配置是看不出任何效果的,必須通過自定義一個PageAdapter,重寫GetStatePersister()方法讓其返回一個SessionPageStatePersister。
或者單純在頁面的隱藏代碼裡面重寫PageStatePersister屬性
那下麵通過一個試驗來證明這個historySize的作用,預設值是
但是這個值太大了,我把它設得小一點
然後在Page_Load方法中添加以下代碼
大概解釋一下就是頁面第一次載入的時候會把lb1標簽的背景顏色設置成紅色,後面的代碼是閱讀了SessionPageStatePersister源碼後發現的,現在是把Session的ViewState的鍵值取出來。下麵的幾幅截圖查看運行 的效果:
第一次請求Session裡面沒有存放ViewState
在第一個文本框輸入一個1之後點擊button提交,響應的頁面如下,Session裡面存放了一個ViewState,並特別關註一下第一個key,__SESSIONVIEWSTATE8d41061dff4faae
如此類推在後面的文本框輸入2,3,4
此時發現就算再提交多少次,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