用户控件级缓存和页面级缓存类似,不同的是可以只缓存页面局部的用户控件,对于不需要整页缓存的页面来说是种不错的解决方案。可是清空页面缓存的 RemoveOutputCacheItem() 方法对用户控件却无效。查阅了很多资料,结论是 .net 没有提供直接清空用户控件输出缓存的方法。我的方法是采用 OutputCache 依赖项变通处理,OutputCache 有一个 VaryByCustom 参数,用于为缓存指定自定义的依赖项,当该项内容变动时就会更新缓存。要使用 VaryByCustom 参数需要重写 Global.asax 的 GetVaryByCustomString() 方法,简单的代码如下:
//arg 是系统传入的自定义变量名,需要在下面进行判断//DataCache 是一个缓存类,这里用于存取 Cache 对象,当更新该Cache对象时,页面缓存同时更新
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if(arg == "ucCacheFlag")
{
Object _flag = DataCache.GetCache("ucCacheFlag");
if(_flag == null)
{
_flag = DateTime.Now.Ticks.ToString();
DataCache.SetCache( "ucCacheFlag", _flag, DateTime.Now.AddMinutes(CommonValue.CacheTime), TimeSpan.Zero);
}
return _flag.ToString();
}
return base.GetVaryByCustomString(context, arg);
}
同时在用户控件的头部声明中加入:
<%@ OutputCache Duration="1800" VaryByCustom="ucCacheFlag" %>
//ucCacheFlag 就是在GetVaryByCustomString()中判断的字符串
只需在程序中更新 key 为 ucCacheFlag 的 Cache,页面输出缓存也会相应更新。可以在 GetVaryByCustomString() 中判断多个关键字,以控制不同的用户控件输出缓存。
如果用户控件中不使用OutputCache这样子的方式来进行缓存的话,个人觉得倒是可以这样子,比如现在我们在用户控件中使用System.Web.Cache.Caching.Cache,现在假如有Cache.Insert("UKey",list),那么要实现你上面的需求,个人觉得可以在用户控件中写public void UCache(int v)这样一个缓存方法,缓存时间为100秒,现在用户控件中的数据可以直接UCache(0)来输出缓存的数据,现在如果aspx页面需要更新某个用户控件中的缓存,现在就可以使用调用用户控件UCache(1)来重新来更新这个缓存,这样来刷新缓存内容。这样子就是变相的来刷新用户控件的缓存了。UCache方法带一个开关参数,传入不同的值进行取缓存或者更新缓存...