【发布时间】: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