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

在顶部中加入 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

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值