程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> sessionPageState與視圖狀態存儲,sessionstatemode

sessionPageState與視圖狀態存儲,sessionstatemode

編輯:關於.NET

sessionPageState與視圖狀態存儲,sessionstatemode


這個配置節甚是簡單,在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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved