关于ViewState的问题 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="之后有一大串乱码

本文介绍了解决ASP.NET中ViewState过大的问题,通过禁用不必要的控件状态或采用服务器端存储ViewState的方法来减少页面负载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自 :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 plain copy
  1.   
[csharp]  view plain copy
  1. using System.IO;  
  2. using System.Threading;  
[csharp]  view plain copy
  1.    
[csharp]  view plain copy
  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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值