您的位置:首页 > 产品设计 > UI/UE

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

2013-03-22 10:51 781 查看
转自 :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

[csharp] view
plaincopy

using System.IO;

using System.Threading;

[csharp] view
plaincopy

[csharp] view
plaincopy

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐