Outputcache 1动作,2个视图

时间:2016-03-30 11:39:47

标签: asp.net-mvc outputcache

所以我有以下操作,我试图将输出缓存添加到:

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24)]
public ActionResult ContactUs()
{
  ContactUsModel model = _modelBuilder.BuildContactUsModel();

  if (Request.IsAjaxRequest())
  {
    return Json(StringFromPartial(partialTemplate, model), JsonRequestBehavior.AllowGet);
  }
  else
  {
    return View(model);
  }
}

但这似乎缓存了所请求的第一个视图 - 即json OR 正常视图。

有没有办法让输出缓存适用于两个视图,而不必将它们从同一个操作中分离出来?

2 个答案:

答案 0 :(得分:1)

感谢REDEVI_的评论指出我正确的方向,我已经能够解决这个问题。

我将输出缓存更改为:

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24, VaryByCustom = "IsAjax")]

然后在我的global.asax文件中,我添加了以下覆盖:

    public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (context != null)
        {
            switch (custom)
            {
                case "IsAjax":
                    return new HttpRequestWrapper(context.Request).IsAjaxRequest() ? "IsAjax" : "IsNotAjax";
            }
        }

        return base.GetVaryByCustomString(context, custom);
    }

答案 1 :(得分:1)

你在回答自己的问题时打败了我,但我认为这段代码可能仍然有用。由于用户的变化是如此常见的情况,您应该考虑能够做到您的AJAX变化。此代码允许您通过附加到单个字符串来改变任意数量的自定义参数。

public override string GetVaryByCustomString(System.Web.HttpContext context, string custom)
{
    var args = custom.ToLower().Split(';');
    var sb = new StringBuilder();

    foreach (var arg in args)
    {
        switch (arg)
        {
            case "user":
                sb.Append(User.Identity.Name);
                break;
            case "ajax":
                if (context.Request.Headers["X-Requested-With"] != null)
                {
                    // "XMLHttpRequest" will be appended if it's an AJAX request
                    sb.Append(context.Request.Headers["X-Requested-With"]);
                }
                break;
            default:
                continue;
        }
    }

    return sb.ToString();
}

然后,如果你需要改变多个自定义参数,你就会做类似下面的事情。

[OutputCache(CacheProfile = OutputCacheProfileNames.Hours24, VaryByCustom = "User;Ajax")]

然后,如果您需要额外的自定义变量参数,您只需继续添加案例陈述以涵盖这些场景。