转自 :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