web-dev-qa-db-ja.com

MVC 3の部分ビューでキャッシュを無効にする

キャッシュすべきではないときに部分ビューがキャッシュされるという問題があります。この部分的なビューは、ページにログオン/ログオフを表示するために使用されます。以下の簡単なコードを使用して、表示するリンクを特定します

@if(Request.IsAuthenticated) {    
    <a href="@Url.Action("LogOff", "Account", new { area = "" })">Log Off</a> 
}
else {
    <a href="@Url.Action("LogOn", "Account", new { area = "" })">Log On</a>
}

この部分的なビューは、MVC3アプリケーションのすべてのページから呼び出されます。

@Html.Partial("_HeaderView")  

ほとんどのコントローラーで出力キャッシュが定義されているので、コンテンツのキャッシュを利用できます。

[OutputCache(Duration = 86400, VaryByParam = "*")]

ここでの問題は、部分的なビューを表示したくないときにページ全体がキャッシュされていることです。これは、ユーザーがログインしていない場合でもLogOffを表示するなどの誤った動作を引き起こしています。問題の部分的なビューを除いて、すべてのコンテンツをキャッシュする方法はありますか?

20
SimpleUser

あなたが探しているものは、ドーナツキャッシングと呼ばれています。これが何であり、どのように機能するかを説明する素晴らしい記事があります http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-

9
torm

_HeaderViewパーシャルを表示するコントローラーを次のように装飾することで、キャッシュを無効にすることができます。

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult HeaderView()
{
    return PartialView("_HeaderView");
}
18
Nick

ページで個別にキャッシュ値を設定するのではなく、Web.configファイルでキャッシュプロファイルを設定して、冗長なコードを回避する必要があります。 OutputCache属性のCacheProfileプロパティを使用して、プロファイルを参照できます。このキャッシュプロファイルは、ページ/メソッドがこれらの設定をオーバーライドしない限り、すべてのページに適用されます。

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="CacheProfile" duration="60" varyByParam="*" />
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>

また、部分ビュー[_HeaderView]を返すアクションからキャッシュを無効にしたい場合は、以下に示すようにその特定のアクションメソッドを装飾することにより、構成キャッシュ設定をオーバーライドできます。

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult RenderPartialView()
{
    return PartialView("_HeaderView");
}

これがあなたに役立つことを願っています!

3
Swati Gupta

MVCに戻った後、これを理解するのに少し時間がかかりました。キャッシュ設定をパーシャルヘッダービューに直接配置するだけです。ユーザー名を表示するときのように。グローバルまたはサーバー側のコードは必要ありません。唯一の問題は、ページがキャッシュされると、ログイン後すぐに更新されないことです。ただし、製品の最初のブラウジングで必要なときに速度を維持します。 Ok私たちの場合はトレードオフです。

 
 @if(Request.IsAuthenticated)
 {
 @ *認証されたら、これ以上キャッシュしないでください! * @ 
 HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
 HttpContext.Current.Response.Cache.SetNoStore(); 
 HttpContext.Current.Response。 Cache.SetNoServerCaching(); 
 @ * @ Html.Raw(DateTime.Now.ToString())* @ 
 @ Html.ActionLink( "Welcome" +(String.IsNullOrEmpty(((System .Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue( "UserName"))?User.Identity.Name:((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue( "UserName"))、 " Index "、" Manage "、routeValues:new {Area =" Store "}、htmlAttributes:new {title =" Manage "})
} 
 else 
 {
} 
 
1
Jeff

これは私のために働いています。

 public ActionResult LogOff()
 {
     AuthenticationManager.SignOut();  
     var url = Url.Action("Index", "Web"); 
     HttpResponse.RemoveOutputCacheItem(url);           
     return RedirectToAction("Index", "Web");
 }
1
Miroslav