2011-02-28 14 views
19

私は私が使用している、私の見解ではASP.NET MVC 3で利用可能な新しいページの部分的なキャッシュを使用しようとしています:ページの部分的なキャッシュとVaryByParam 3

<% Html.RenderAction("RenderContent", Model); %> 

どちらをコントローラメソッドを呼び出します。

[Authorize] 
[OutputCache(Duration = 6000, VaryByParam = "*", VaryByCustom = "browser")] 
public ActionResult RenderContent(Content content) 
{ 
    return PartialView(content); 
} 

元のビューと部分ビューの両方が同じビューモデルを使用しています。

が問題になる - RenderContent()は、どのビューモデルに渡されても常に同じキャッシュHTMLを返します。私が理解できない何かがVaryByParamですか?

+0

、キャッシュワイズ?また、VaryByParamは、アクションメソッドに渡されたモデルとは何の関係もありません。このメソッドは、ブラウザの*メソッドによって呼び出されるパラメータ(クエリ文字列、フォームなど)と関連しています。 – bzlm

+0

呼び出しアクションメソッドでキャッシュが指定されていません。 –

+0

@bzlm、部分ページキャッシュ*は入力パラメータと関係しますが、クエリ文字列/フォームフィールドではありません。 http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx、セクション出力キャッシュの改善を参照してください。 – Carvellis

答えて

26

私はそれを理解したと思います。 VaryByParamは、入力パラメーターがオブジェクトの場合、そのオブジェクトのToString()を使用して一意性を判断するという問題があるようです。したがって、次の2つのオプションがあります。

  1. ToString()を一意の識別子として使用します。
  2. 追加パラメータとして一意の識別子を渡す:呼び出し元のアクションメソッドが飾られているどのように

    <% Html.RenderAction("RenderContent", Model, Model.Id); %> 
    
    [Authorize] 
    [OutputCache(Duration = 6000, VaryByParam = "id", VaryByCustom = "browser")] 
    public ActionResult RenderContent(Content content, string id) 
    { 
        return PartialView(content); 
    } 
    
+1

偉大な答えです。オプション1を使用しました。 'public ToString()'の中で 'GetHashCode()。ToString();'を使って各オブジェクトに一意のコードを作成しました。これはうまくいくようです。 –

+0

'' 'GetHashCode()。ToString()' ''を一意のIDとして使用しないでください。ハッシュコードは一意であるようには設計されておらず、一意的なものだけが設計されています。 – erikkallen

関連する問題