日期:2014-05-17  浏览次数:20423 次

压缩ViewState的疑问
页面的ViewState占用得太多,所以进行了一下压缩,压缩后的确是小了很多,但放在UpdatePannel里面后,无论后台怎么变话,前面获取到的都还是上次的结果,请问是为什么?

压缩方式是重写两个方法:

 protected override object LoadPageStateFromPersistenceMedium()
{
    string viewState = Request.Form["__VSTATE"];
    byte[] bytes = Convert.FromBase64String(viewState);
    bytes = Decompress(bytes);
    LosFormatter formatter = new LosFormatter();
    return formatter.Deserialize(Convert.ToBase64String(bytes));
}

protected override void SavePageStateToPersistenceMedium(object viewState)
{
    LosFormatter formatter = new LosFormatter();
    StringWriter writer = new StringWriter();
    formatter.Serialize(writer, viewState);
    string viewStateString = writer.ToString();
    byte[] bytes = Convert.FromBase64String(viewStateString);
    bytes = Compress(bytes);
    ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes));
}      


UpdatePannel中的按钮按以下方式进行了事件:

protected void Button1_Click(object sender, EventArgs e)
{
    TextBox1.Text = ViewState["dataIndex"].ToString();
    ViewState["dataIndex"] = "3";
}


但前端看到的TextBox1.Text的值始终是1.
ViewState压缩? web性能

------解决方案--------------------
讨厌viewstate 可以用mvc

。net webform就这样
------解决方案--------------------
basepage.cs文件


#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 + ".txt");
                stateStr = File.ReadAllText(fn);
            }
            return new ObjectStateFormatter().Deserialize(stateStr);
        }
        protected override void SavePageStateToPersistenceMedium(object state)
      &nbs