MVC 5:PartialViewResult操作缓存永远不会随VaryByParam更改:=" *"

时间:2016-10-01 07:10:24

标签: asp.net-mvc vb.net razor

我在使用OutputCache进行部分查看操作时出现问题。我的索引操作控制器定义如下......

<OutputCache(Duration:=3600, VaryByParam:="*")>      
<Route("")>
<HttpGet>
Public Function Index(value As MySearchFilter) As ActionResult
    ViewData("Title") = "Search Jobs"
    Return View("Index", value)
End Function

我有一个像这样定义的PartialViewResult动作......

<OutputCache(Duration:=3600, VaryByParam:="*")>
<Route("search")>
<HttpGet>
Public Function Search(value As MySearchFilter) As PartialViewResult
    Return PartialView("_List", Search(value))
End Function

在我的索引视图(vbhtml)中,我像这样调用部分动作......

@Html.Action("Search")

没有缓存,这可以正常工作。我可以看到&#34;搜索&#34;动作是将正确的过滤器对象传递给它等。

我遇到的问题是启用了缓存,VaryByParam:=&#34; *&#34;似乎被忽略了。即使查询字符串参数发生变化,结果也不会改变。当我调试时,我可以看到该动作仅在第一次被调用,而在此之后才被调用。

主要&#34;指数&#34;动作正常,对参数的任何更改都会正确缓存不同的内容。

我知道我可以在索引操作上使用缓存,然后关闭&#34;搜索&#34;行动,但我有其他一些部分观点,我希望能够为每个观点独立控制缓存。

注意: 我没有尝试通过RouteData.Values自定义缓存,我试图通过Querystring参数来定制它,这应该是VaryByParam所做的。在调试器中,我可以看到Request.QueryString可用于控制器操作。我完全难过,我无法理解它为什么不起作用。

1 个答案:

答案 0 :(得分:0)

我发现解决方案部分来自Partial Page Caching and VaryByParam in ASP.NET MVC 3

显然,对于子控制器操作,它不使用URL或表单参数,而是使用控制器方法参数。要确定它们是否已更改,它会在每个参数上调用.ToString()。对于简单类型,这很好,但对于复杂对象,您必须覆盖.ToString(),否则它永远不会改变。它只会返回该类的名称。

以防它有用。这是我的ToString方法,它在我的所有视图模型继承的基类中定义...

Public Overrides Function ToString() As String
    Return JsonConvert.SerializeObject(Me)
End Function

这似乎是一种相当简洁/可靠的方法,可确保对任何属性的任何更改都能正确更改缓存。