ASP.NET MVC 3中的部分页面缓存和VaryByParam

19

我正尝试使用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
调用操作方法上未指定缓存。 - James Sulak
@bzlm,页面部分缓存确实与输入参数有关,而不是查询字符串/表单字段。请参见http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx,输出缓存改进部分。 - Carvellis
@Jappie 你说得对。很好的东西!但从技术上讲,“当您在操作方法上使用显式参数时,自动变化输出缓存条目”即使对于使用GET的普通操作,在ASP.NET MVC 1中也是正确的。(不过还是需要在那里使用VaryByParam。) - bzlm
1个回答

27

我想我找到了解决方法。问题似乎是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
非常好的答案,正是我们所需要的。我们使用了选项1。在public override string ToString()中使用return GetHashCode().ToString();来为每个对象创建一个唯一的代码。这似乎工作得很好。 - Tom Styles
不要使用GetHashCode().ToString()作为唯一标识符。哈希码并不是设计用来唯一的,只是尽可能地唯一。 - erikkallen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接