所以我有以下操作,我试图将输出缓存添加到:
[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 正常视图。
有没有办法让输出缓存适用于两个视图,而不必将它们从同一个操作中分离出来?
答案 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")]
然后,如果您需要额外的自定义变量参数,您只需继续添加案例陈述以涵盖这些场景。