2011-04-14 60 views
1

当我在action方法上使用outputcaching时,它被完整的url缓存,我想要做的是缓存页面,但忽略url的某些部分。在Global.asax中定义使用Outputcache忽略url值

定制路线:

routes.MapRoute(
    "Template", 
    "Report/{reportid}/{reportname}/Template/{templateid}/{action}", 
    new { controller = "Template", action = "Index" } 
); 

我的模板控制器

public class TemplateController : Controller 
{ 
    [OutputCache(Duration=60*60*2)] 
    public ActionResult Index(Template template) 
    { 
     /* some code */ 
    } 
} 

例如,当我去到以下网址:

http://mywebsite.com/Report/789/cacheme/Template/5
- >缓存根据网址提供2小时

http://mywebsite.com/Report/777/anothercacheme/Template/5
- >也被缓存基于该URL2小时

我想的是,的OutputCache忽略REPORTNAME和reportid值所以,当我去到上述网址的则返回相同缓存版本。这是可能的OutputCache属性或将我必须编写我的自定义OutputCache FilterAttribute?

+0

也许,方式之一可能是使REPORTNAME,reportid作为参数的方法,然后用'VaryByParam'只templateid。除此之外,自定义筛选器属性将成为您的选择! – VinayC 2011-04-14 08:40:05

+0

我试过了,但它仍然会为请求的模板返回不同的缓存版本 – 2011-04-14 10:06:48

回答

1

结束了与以下(按http://blog.stevensanderson.com/2008/10/15/partial-output-caching-in-aspnet-mvc/启发):

public class ResultCacheAttribute : ActionFilterAttribute 
    { 
     public ResultCacheAttribute() 
     { 

     } 

     public string CacheKey 
     { 
      get; 
      private set; 
     } 

     public bool AddUserCacheKey { get; set; } 
     public bool IgnoreReport { get; set; } 

     /// <summary> 
     /// Duration in seconds of the cached values before expiring. 
     /// </summary> 
     public int Duration 
     { 
      get; 
      set; 
     } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      string url = ""; 
      foreach (var item in filterContext.RouteData.Values) 
      { 
       if (IgnoreReport) 
        if (item.Key == "reportid" || item.Key == "reportname") 
         continue; 

       url += "." + item.Value; 
      } 
      if (AddUserCacheKey) 
       url += "." + filterContext.HttpContext.User.Identity.Name; 

      this.CacheKey = "ResultCache-" + url; 

      if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
       this.CacheKey += "-ajax"; 

      if (filterContext.HttpContext.Cache[this.CacheKey] != null) 
      { 
       filterContext.Result = (ActionResult)filterContext.HttpContext.Cache[this.CacheKey]; 
      } 
      else 
      { 
       base.OnActionExecuting(filterContext); 
      } 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      filterContext.Controller.ViewData["CachedStamp"] = DateTime.Now; 
      filterContext.HttpContext.Cache.Add(this.CacheKey, filterContext.Result, null, DateTime.Now.AddSeconds(Duration), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default, null); 

      base.OnActionExecuted(filterContext); 
     } 
    }