【问题标题】:Compressing viewstate is adding another hidden field with same id as __VIEWSTATE压缩视图状态正在添加另一个与 __VIEWSTATE 具有相同 ID 的隐藏字段
【发布时间】:2013-10-20 08:35:28
【问题描述】:

我正在尝试在 ASP.Net 4.0 中压缩视图状态,因此对于严重臃肿的视图状态页面,页面加载速度更快。

但是,当我在浏览器中查看页面源时,我发现 2 个隐藏字段具有相同的名称和 '__VIEWSTATE' 的 ID。

我的代码如下。 如何压缩视图状态,但让它存储在原来的隐藏字段中,而不创建另一个重复的隐藏字段?

protected override void SavePageStateToPersistenceMedium(object viewState)
{
    byte[] viewStateArray;
    using (MemoryStream memoryStream = new MemoryStream())
    {
        _objectStateFormatter.Serialize(memoryStream, viewState);
        viewStateArray = memoryStream.ToArray();
    }
    ClientScript.RegisterHiddenField("__VIEWSTATE",
                 Convert.ToBase64String(GZip.Compress(viewStateArray)));
}

【问题讨论】:

    标签: asp.net viewstate


    【解决方案1】:
    using System.IO;
    using System.IO.Compression;
    using System.Web.UI;
    

    公共类 PageCompressed : System.Web.UI.Page {

    private ObjectStateFormatter _formatter = new ObjectStateFormatter();
    protected override void SavePageStateToPersistenceMedium(object viewState)
    {
        MemoryStream ms = new MemoryStream();
        _formatter.Serialize(ms, viewState);
        byte[] viewStateArray = ms.ToArray();
        ClientScript.RegisterHiddenField("__CVIEWSTATE", Convert.ToBase64String(_Compress(viewStateArray)));
    }
    protected override object LoadPageStateFromPersistenceMedium()
    {
        string vsString = Request.Form["__CVIEWSTATE"];
        byte[] bytes = Convert.FromBase64String(vsString);
        bytes = _DeCompress(bytes);
        return _formatter.Deserialize(Convert.ToBase64String(bytes));
    }
    
    private byte[] _Compress(byte[] inputBytes)
    {
        MemoryStream m = new MemoryStream();
        GZipStream zip = new GZipStream(m, CompressionMode.Compress, true);
        zip.Write(inputBytes, 0, inputBytes.Length);
        zip.Close();
        return m.ToArray();
    }
    private byte[] _DeCompress(byte[] inputBytes)
    {
        MemoryStream m = new MemoryStream(inputBytes);
        MemoryStream mout = new MemoryStream();
        GZipStream zip = new GZipStream(m, CompressionMode.Decompress, true);
        do
        {
            byte[] bBuffer = new byte[4097];
            int iRead = zip.Read(bBuffer, 0, bBuffer.Length);
            if (iRead > 0)
            {
                mout.Write(bBuffer, 0, iRead);
            }
            else
            {
                break; 
            }
        } while (true);
        zip.Close();
        return mout.ToArray();
    }
    }
    

    您可以使用这个接口类来压缩视图状态,方法是在每个页面的代码中像这样继承它

    公共部分类默认值:PageCompressed

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2021-03-20
      相关资源
      最近更新 更多