【问题标题】:Donut caching _Layout with mvcdonutcaching ASP.NET MVC使用 mvcdonutcaching ASP.NET MVC 缓存 _Layout
【发布时间】:2015-03-18 03:02:43
【问题描述】:

在我的 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 上实现甜甜圈缓存,以便_LoginPartial 不会被缓存,原因很明显。我正在使用 mvcdonutcaching 库来完成此操作(在 this answer 中建议),它提供了一些 @Html.Action 的重载,这些重载具有额外的 bool excludeFromParentCache 属性。

因此,我创建了一个带有UserAuth 操作的LayoutController,该操作返回_LoginPartial

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

..在我的 _Layout 文件中,我希望 _LoginPartial 出现,我将 mvcdonutcaching Html.Action 重载称为:

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

为了对此进行测试,我在FAQControllerIndex 操作上设置了一个持续时间较长的OutputCache,但如果我按照以下步骤操作:

  • 登录
  • 导航到 /faq
  • 注销
  • 导航到 /faq

/faq 仍然显示我已登录。

我在这里缺少什么?这是 mvcdonutcaching 在实际 HTML 中的输出:

<!--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 视图中的部分视图中 - 问题仍然存在。

【问题讨论】:

  • 你也可以添加你的父控制器动作吗?
  • 嘿@DaveWalker,因为这从未引起任何关注,不幸的是我很久以前就放弃了这种方法。如果您有一个可行的示例,我将非常乐意尝试并查看它。
  • 我好久没做过了,所以需要慢慢回忆。我想知道是不是因为它在布局中。
  • 可能是。我想说我也尝试过这种情况,但已经有一段时间了,所以我可以完全关闭 :)
  • 您可以尝试将 Request.IsAuthenticated 移动到子操作并返回带有视图的布尔模型吗?并在视图中检查模型。

标签: c# asp.net-mvc caching asp.net-mvc-5 donut-caching


【解决方案1】:

我遇到了完全相同的问题,但在注意到我无意中使用了 [OutputCache] 而不是 [DonutOutputCache] 后解决了它!

用户错误。在_Layout 工作得很好。请仔细检查您是否使用了正确的 [DonutOutputCache] 属性。

【讨论】:

    【解决方案2】:

    将您的操作移至AccountMember 控制器避免使用LayoutController

    您应该查看官方演示:https://github.com/moonpyk/mvcdonutcaching/tree/master/DevTrends.MvcDonutCaching.Demo

    尤其是AccountController 和视图...

    问候...

    【讨论】:

    • 为什么要避免使用 LayoutController?
    猜你喜欢
    • 2015-03-19
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2015-09-01
    相关资源
    最近更新 更多