23

私の ASP.NET MVC プロジェクトでは、共有ファイルのナビゲーション メニューにログイン サブメニューがあり_Layout.cshtml、ユーザーがログインしている場合はユーザー情報を表示し、ログインしていない場合はサインアップ/ログイン オプションを表示します。ログイン サブメニューは、次の名前の共有フォルダーの部分ビューです_LoginPartial

@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
    //display <ul> with user profile settings, omitted for brevity
}
else
{
    //display <ul> to signup/login, omitted for brevity    
}

さまざまなコントローラーのいくつかのアクションを大量にキャッシュしていますが、明らかな理由から、キャッシュされない_Layoutようにドーナツキャッシュを実装したいと考えています。これを達成するためにmvcdonutcachingライブラリを_LoginPartial使用しています (この回答で推奨されています)。これは、追加のプロパティを持ついくつかのオーバーロードを提供します。@Html.Actionbool excludeFromParentCache

そのため、次を返すアクションでを作成LayoutControllerしました。UserAuth_LoginPartial

public class LayoutController : Controller
{
    [ChildActionOnly]
    public ActionResult UserAuth()
    {
        return PartialView("_LoginPartial");
    }
} 

..そして、表示し_Layoutたいファイルで、mvcdonutcachingオーバーロードを次のよう_LoginPartialに呼び出します。Html.Action

@Html.Action("UserAuth", "Layout", true)

これをテストするために、 のアクションにOutputCache長時間の を設定しましたが、次の手順に従うと:IndexFAQController

  • ログインする
  • /faq に移動します
  • ログアウト
  • /faq に移動します

/faq はまだログインしていると表示されます。

ここで何が欠けていますか?これは、実際の HTML での mvcdonutcaching の出力です。

<!--Donut#3ED0C02DC8A537BA39C854B0D03E9A954F9FD01409A5E10C6C623D32512359E90086702A97EB36055229506A07D84CC1F6F7D1BF0A230DE5E87423363C24CA8D8C93D671FF398054DA29A7594CE2B8E939195C563004CE281D76DD838DB25198FCCCEC694F80885B86E611E2C5D9DE0C0B9B67432AD021FF581FD4A652C611D62B12C4C3A327E917940F333B56268D530831CCA617AF126AA0F809E5FBF1AB3C4231B11851F0BC73ED1A0B43A81AFF7B9FB081B7DF4B90712965596411627ECABD9DDFD519438910DBFCB94A22C216B1C3ABDBB5FC5E436E838505E6B56698E37CDF09A47CEAB5A3E3269FA326EA9191142954445BC92CE50248A0F7B964764C6E6768A92C31E55AE07AF230ECB7B8E8A5B048A82CD035095D84BDDA6336ED7805BB89CAB8C92AF1E4FA7971DF92CC2C2BC68CF605B594191DD55BDAF4E90D6451EF10FA18140B4201D16071052D5CC2B9490BFA00B2DDC622ED22CA1F8DB75E5F30E830B9D7B13778BC6E63EC49745AC037A4009A4CF05749568BD4D3DB8AE4A1E08024#-->  
<ul class="nav navbar-nav navbar-right">
    <ul class="dropdown-menu" role="menu">
            <li><a href="/manage" class="dropdown" title="Manage your account"><i class="fa fa-user fa-lg"></i> Account</a></li>
            <li class="divider"></li>
            <li><a href="javascript:document.getElementById('logoutForm').submit()" title="Log out"><i class="fa fa-sign-out fa-lg"></i> Log out</a></li>
        </ul>
</ul>
<!--EndDonut-->

更新:代わり_LoginPartialにのビューにある部分ビューにメニューを移動しようとしました-問題は解決しません。LayoutController

4

2 に答える 2

1

私はまったく同じことに遭遇しましたが、誤って![OutputCache]の代わりに使用したことに気づいた後、解決しました。[DonutOutputCache]

ユーザーエラー。美しく_Layout働きます。[DonutOutputCache]適切な属性を使用していることを再確認してください。

于 2016-02-05T21:16:53.830 に答える
0

アクションをAccountまたはMemberコントローラーに移動し、使用を避けLayoutControllerます。

公式デモを確認してください: https://github.com/moonpyk/mvcdonutcaching/tree/master/DevTrends.MvcDonutCaching.Demo

特にAccountController景色...

よろしく...

于 2016-01-25T19:53:47.133 に答える