關於ViewState的問題

轉自 :http://blog.csdn.net/spritenet/article/details/8178925


在頂部中加入 EnableViewState="false" ,就可以去掉了,前提是你用不到它

 

先去開會,分析回來再寫

------------------------------------------------

 

 

昨天開完會回來就下班了,今天補上

 

昨天寫程序的時候由於在GridView_RowDataBound寫了幾個循環,編譯好查看了一下html源文件

 

不看不知道啊,網頁下載下來後有3M多大,用記事本直接打不開,記事本打開3m的文本。。。。。。。。。

 

後來簡化了一下GridView_RowDataBound的循環結構,結果最小還是將近700多K,而且<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=".......之後的亂碼將近是150多k

 

也就是說,要想達到我要求的效果,其中ViewState的代碼大概是2.5M左右...........

 

網上查了下,有一種解決辦法是在頂部中加入 EnableViewState="false" ,就可以去掉了,也就是關閉視圖狀態,但是會存在一定問題,就是代碼響應的問題,

 

viewstate,字面上講就是視圖狀態,也就是頁面上的那些控件的狀態,例如值是什麼,是選中還是沒選中,就是由這些viewstate來保存的。由於http是沒有狀態的協議,而.net要實現一中模擬的持續狀態,就採用了這種方式

 

比如 在Button1_Click事件中,編寫代碼:

ListBox.Items.Add(”客戶端點擊按鈕一次!”);

此時運行該應用程序,單擊網頁上的按鈕,在ListBox中會添加內容,不斷地單擊,內容則不斷添加。如果我們將ListBox的EnableViewState屬性改爲false時,不斷單擊按鈕,則只能添加一次。

這樣有什麼好處呢?如果我們在開發Web應用程序時,某些控件是不需要接受用戶的操作或只需要接受一次操作的時候,我們可以將這些控件的EnableViewState屬性改爲false,這樣可以優化我們的程序,提高網絡訪問的速度。

比如新聞網站的前臺,不需要什麼交互,這樣你就可以把視圖狀態給禁用了

 

如果既想打開視圖,而又擔心ViewState的代碼過多,就可以使用下面的方法,在頁面中加入如下代碼

 

 

 

[csharp] view plaincopy
  1.   
[csharp] view plaincopy
  1. using System.IO;  
  2. using System.Threading;  
[csharp] view plaincopy
  1.    
[csharp] view plaincopy
  1. #region 解決ViewState過於龐大的問題  
  2.     //由於這裏添加了目錄,所以要建立App_Data/ViewState目錄.           
  3.     protected override object LoadPageStateFromPersistenceMedium()  
  4.     {  
  5.         string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;  
  6.         string stateStr = (string)Cache[viewStateID];  
  7.         if (stateStr == null)  
  8.         {  
  9.             string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);  
  10.             stateStr = File.ReadAllText(fn);  
  11.         }  
  12.         return new ObjectStateFormatter().Deserialize(stateStr);  
  13.     }  
  14.   
  15.     protected override void SavePageStateToPersistenceMedium(object state)  
  16.     {  
  17.         string value = new ObjectStateFormatter().Serialize(state);  
  18.         string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //產生離散的id號碼     
  19.         string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);  
  20.         //ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));            
  21.         File.WriteAllText(fn, value);  
  22.         Cache.Insert(viewStateID, value);  
  23.         base.SavePageStateToPersistenceMedium(viewStateID);  
  24.     }  
  25.  
  26.     #endregion  


當然要在App_Data下建立ViewState文件夾,這樣只會產生“<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPBRI2MzQ4ODQ4NTc5NDY2NzE3ODFkyU95B+ulMWCLzjLeRYst9DMKWoE=" />”這些代碼

原理就是使用了緩存,將ViewState持久化保持在服務器端的代碼,這樣ViewState不佔用網絡帶寬,因此其存取只是服務器的磁盤讀取時間。並且它很小,可以說是磁盤隨便轉一圈就能同時讀取好多ViewState,因此可以說“不佔時間”。爲了再“不佔磁盤時間”,還使用了緩存。

 

參考資料如下:

http://zhidao.baidu.com/question/147398216.html

http://www.cnblogs.com/wayfarer/archive/2004/04/25/7574.aspx

http://www.fyyy.org/bencandy.php?fid-4-id-112-page-1.htm

http://bbs.csdn.net/topics/270013573

http://bbs.csdn.net/topics/230052606

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章