【问题标题】:Partial Page Caching and VaryByParam in ASP.NET MVC 3ASP.NET MVC 3 中的部分页面缓存和 VaryByParam
【发布时间】:2011-07-05 21:37:07
【问题描述】:

我正在尝试使用 ASP.NET MVC 3 中可用的新部分页面缓存。在我看来,我正在使用:

<% Html.RenderAction("RenderContent", Model); %>

调用控制器方法:

[Authorize]
[OutputCache(Duration = 6000, VaryByParam = "*", VaryByCustom = "browser")]
public ActionResult RenderContent(Content content)
{
   return PartialView(content);
}

请注意,原始视图和局部视图都使用相同的视图模型。

问题是VaryByParam 不起作用 - 无论传递给它的视图模型是什么,RenderContent() 总是返回相同的缓存 HTML。 VaryByParam 有什么我不明白的地方吗?

【问题讨论】:

  • 调用动作方法是如何装饰的,缓存方式?此外,VaryByParam 与传递给操作方法的模型无关 - 它与浏览器发送的参数(查询字符串、表单等)有关 - 到调用操作方法,在这种情况。
  • 调用动作方法没有指定缓存。
  • @bzlm,部分页面缓存确实与输入参数有关,与查询字符串/表单字段无关。请参阅weblogs.asp.net/scottgu/archive/2010/12/10/…,输出缓存改进部分。
  • @Jappie 你是对的。好东西!但是,从技术上讲,“当您在操作方法上有显式参数时自动更改输出缓存条目”即使对于使用 GET 的正常操作的 ASP.NET MVC 1 也是如此。 (不过还是要VaryByParam。)

标签: c# asp.net-mvc caching asp.net-mvc-3


【解决方案1】:

我想我明白了。看起来问题是 VaryByParam,当输入参数是一个对象时,在该对象上使用 ToString() 来确定它的唯一性。所以这留下了两个选择:

  1. 覆盖 ToString() 以提供唯一标识符。
  2. 将唯一标识符作为附加参数传递:

    <% Html.RenderAction("RenderContent", Model, Model.Id); %>
    
    [Authorize]
    [OutputCache(Duration = 6000, VaryByParam = "id", VaryByCustom = "browser")]
    public ActionResult RenderContent(Content content, string id)
    {
       return PartialView(content);
    }
    

【讨论】:

  • 很好的答案,正是我们所需要的。我们使用选项 1。在 public override string ToString() 中使用 return GetHashCode().ToString(); 为每个对象创建一个唯一代码。这似乎工作正常。
  • 不要使用 GetHashCode().ToString() 作为唯一 ID。哈希码不是设计为唯一的,只是唯一的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多