.NET ViewState对于画面的速度影响

最近开发一个.NET网站,发现有一个画面的交互特别缓慢,查了很多原因都没查到

最后终于知道,是因为画面的ViewState用的过多,其中有一个ViewState保存的数据相对而言比较大,导致了画面的运行缓慢

于是我再次仔细的了解了ViewState的用途,终于发现网上有很多牛人想到了将VIEWSTATE转换为文件保存在服务器上

以下这段代码可以放在页面中,或者页面的父类中:
protected override object LoadPageStateFromPersistenceMedium()
{
    var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
    var stateObject = Cache[viewStateID];
    if (stateObject != null)
        return stateObject;
 
    var fn = this.Server.MapPath("~/App_Data/ViewState/" + viewStateID);
    var stateStr = File.ReadAllText(fn);
    return new ObjectStateFormatter().Deserialize(stateStr);
}
 
protected override void SavePageStateToPersistenceMedium(object state)
{  var viewStateID = (DateTime.Now.Ticks + this.GetHashCode()).ToString(); //产生离散的id号码
    Cache.Insert(viewStateID, state);
    var value = new ObjectStateFormatter().Serialize(state);
  
    var fn = this.Server.MapPath("~/App_Data/ViewState/" + viewStateID);
    ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value));
    base.SavePageStateToPersistenceMedium(viewStateID);
}
 
下面这段可以放在Global.asax中,也可以根本不管:



protected void Application_Start(object sender, EventArgs e)
{
    var dir = new DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
    if (!dir.Exists)
        dir.Create();
    else
    {
        var nt = DateTime.Now.AddHours(-1);
        dir.GetFiles().ForEach(f =>
        {
            if (f.CreationTime < nt)
                f.Delete();
        });
    }
}
这可以确保绝对稳定可靠地工作。以后请放心使用ViewState,把交互式页面提高水平才是最重要的,不要纠缠在“ViewState太大”上。实际上,由于页面设计不够酷,交互变化看上去不够丰富,ViewState实在是太小太小了。
原文地址:https://www.cnblogs.com/zhuxiaohui/p/3326001.html