2016-10-01 67 views
1

我有OutputCache問題的局部視圖操作。我的索引動作控制器的定義是這樣的...MVC 5:PartialViewResult動作緩存永遠不會改變VaryByParam:=「*」

<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可用於控制器操作。我完全被難住了,我不明白爲什麼它不起作用。

+0

[Does VaryByParam =「\ *」是否也讀取RouteData.Values?](http://stackoverflow.com/questions/4518671/does-varybyparam-also-read-routedata-values) – GSerg

+0

這可能不是'不幸的是,從我讀過的所有內容來看,我所做的事情應該可行,但事實並非如此。查詢字符串參數正在改變,但由於某種原因,這被忽略。 – user1751825

+0

想通了。我必須爲MySearchFilter類重寫.ToString()。 – user1751825

回答

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 

這似乎是確保任何改變任何財產正確地改變了一個相當整齊/可靠的方法緩存。