2016-10-01 21 views
1

部分的なビューアクションのためにOutputCacheに問題があります。私のindexアクションコントローラはそう...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 

のように定義されていると私は私のIndexビュー(vbhtml)ではそう...

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

ように定義するPartialViewResult作用を有する、私は部分的なアクションを呼び出しますそうですね...

@Html.Action("Search") 

これはキャッシュせずに正常に動作します。 "Search"アクションが渡された正しいフィルタオブジェクトを取得しているのがわかります。

私が抱えている問題は、キャッシングを有効にするとVaryByParam:= "*"が無視されるようです。クエリ文字列のパラメータが変更された場合でも、結果は変更されません。私がデバッグすると、そのアクションは最初に呼び出されるだけで、それ以降は呼び出されません。

「インデックス」の主な動作は正しく機能し、パラメータの変更によって異なるコンテンツが正しくキャッシュされます。

インデックスアクションでキャッシュを使用し、「検索」アクションでキャッシュをオフにすることはできますが、他の部分的なビューが多数あり、独立してキャッシュを制御できるようにしたいと思いますそれぞれについて。

注:RouteData.Valuesによってキャッシュをカスタマイズするつもりはありません。私は、VaryByParamとまったく同じであるはずのQuerystringパラメータでカスタマイズしようとしています。デバッガでは、Request.QueryStringがコントローラアクションで使用できることがわかります。私は完全に困惑している、私はそれが動作していない理由を理解することはできません。

+0

[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()をオーバーライドする必要があります。それ以外の場合は変更されません。それはクラスの名前を返します。

場合によっては便利です。これは、これは任意のプロパティへの変更が正しく変更されることを保証するために、かなりきちんとした/信頼性の高い方法であるように思わ...

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

すべての私の見解モデルが継承する基底クラスで定義されている私のToStringメソッドであり、キャッシュ。

関連する問題