ViewState持久化方法

网上找来的代码,备用。具体如下:

后台cs代码
protected override object LoadPageStateFromPersistenceMedium()
    {
        var viewStateID 
= (string)(((Pair)base.LoadPageStateFromPersistenceMedium()).Second); 
        var stateStr 
= (string)Cache[viewStateID];
        
if (stateStr == null)
        {
            var fn 
= Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
            
if (File.Exists(fn)) //防止删除报错
            {
                stateStr 
= File.ReadAllText(fn);
            }
        }
        
return new ObjectStateFormatter().Deserialize(stateStr);
    }

    
protected override void SavePageStateToPersistenceMedium(object state)
    {
        var value 
= new ObjectStateFormatter().Serialize(state);  //获取页面状态
        var viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码  
        var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
        ThreadPool.QueueUserWorkItem(obj 
=> File.WriteAllText(fn, value)); //插入线程池中,写入硬盘
        Cache.Insert(viewStateID, value);   //用sesson也可以
        base.SavePageStateToPersistenceMedium(viewStateID);

    }

这样viewstate已经存入硬盘,持久化目标达成。但为了防止临时文件越来越大,添加一个定期清理的方法在Global.asax的Application_Start中添加如下方法

清理缓存文件方法
    if (!dir.Exists)
            dir.Create();
        
else
        {
            var nt = DateTime.Now.AddHours(-1); //1小时过期
            foreach (var item in dir.GetFiles())
            {
                
if (item.CreationTime < nt)
                    item.Delete();
            }
        }


 

 

posted @ 2010-04-24 16:34  卒子  阅读(169)  评论(0编辑  收藏  举报