轉自 :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的代碼過多,就可以使用下面的方法,在頁面中加入如下代碼
- using System.IO;
- using System.Threading;
- #region 解決ViewState過於龐大的問題
- //由於這裏添加了目錄,所以要建立App_Data/ViewState目錄.
- protected override object LoadPageStateFromPersistenceMedium()
- {
- string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
- string stateStr = (string)Cache[viewStateID];
- if (stateStr == null)
- {
- string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
- stateStr = File.ReadAllText(fn);
- }
- return new ObjectStateFormatter().Deserialize(stateStr);
- }
- protected override void SavePageStateToPersistenceMedium(object state)
- {
- string value = new ObjectStateFormatter().Serialize(state);
- string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //產生離散的id號碼
- string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
- //ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
- File.WriteAllText(fn, value);
- Cache.Insert(viewStateID, value);
- base.SavePageStateToPersistenceMedium(viewStateID);
- }
- #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