【问题标题】:MVC 5: PartialViewResult action cache never changes with VaryByParam:="*"MVC 5:PartialViewResult 动作缓存永远不会随着 VaryByParam:="*" 而改变
【发布时间】:2016-10-01 18:50:59
【问题描述】:

对于部分视图操作,我遇到了 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")

这在没有缓存的情况下可以正常工作。我可以看到“搜索”操作正在将正确的过滤器对象传递给它等等。

我遇到的问题是,启用缓存后,VaryByParam:="*" 似乎被忽略了。结果永远不会改变,即使查询字符串参数发生变化。当我调试时,我可以看到该动作只在第一次被调用,之后就再也没有被调用过。

主要的“索引”动作正常工作,对参数的任何更改都会正确缓存不同的内容。

我知道我可以只在索引操作上使用缓存,并为“搜索”操作关闭它,但我有许多其他部分视图,我希望能够独立控制缓存每个。

注意: 我不是试图通过 RouteData.Values 自定义缓存,我试图通过 Querystring 参数自定义它,这应该正是 VaryByParam 所做的。在调试器中,我可以看到 Request.QueryString 可用于控制器操作。我完全被难住了,我不明白为什么它不起作用。

【问题讨论】:

  • 不幸的是,这无济于事。从我读过的所有内容来看,我正在做的事情应该有效,但事实并非如此。查询字符串参数正在更改,但由于某种原因被忽略了。
  • 想通了。我必须为 MySearchFilter 类覆盖 .ToString()。

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


【解决方案1】:

我从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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多