【问题标题】:OutputCache stopping my username from displaying in headerOutputCache 阻止我的用户名显示在标题中
【发布时间】:2014-06-17 21:58:51
【问题描述】:

在我的网站上,我的 _Layout.cshtml 中定义了一个标题。在那个文件中,我正在这样做:

<li class="dropdown">
    @if (Request.IsAuthenticated)
    {
        <a href="#" class="dropdown-toggle menuItem" data-toggle="dropdown" style="color: red;">@User.Identity.Name <b class="caret"></b></a>
    }
    else
    {
        <a href="#" class="dropdown-toggle menuItem" data-toggle="dropdown">Profile <b class="caret"></b></a>
    }

    <ul class="dropdown-menu">
        @if (!Request.IsAuthenticated)
        { 
            <li><a href="/Account/Register">Register</a></li>
            <li><a href="/Account/Login">Login</a></li>
            <li><a href="/Account/ForgotPassword">Forgot Password</a></li>
        }
        else
        { 
            <li><a href="/Account/ChangePassword">Change Password</a></li>
            <li><a href="/Account/EditProfile">Edit Profile</a></li>
            <li><a href="/Account/Logout">Logout</a></li>
        }
    </ul>
</li>

所以,我想动态显示我的菜单项名称,以及基于用户是否登录的内容。

我的所有控制器中 99% 的方法都实现了 [OutputCache] 属性。因此,在我登录该站点后,菜单项仍然显示“个人资料”以及与个人资料一起出现的相应菜单项(即注册、忘记密码等)。

我是否必须关闭网站中的缓存才能在登录后立即显示用户名?这在我的开发环境中非常有效,因为我在缓存属性周围使用了#IF DEBUG 语句...

例如,这是我的 HomeController:

#if !DEBUG
    [OutputCache(Duration = 86400)]
#endif
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }

【问题讨论】:

  • 可能会更糟...假设您登录时页面被缓存...敏感信息可能会泄露。我想知道 mvc 现在是否支持甜甜圈缓存...
  • @spender 非常有趣,所以我是否需要同时指定 DonutCache 以及常规的 OutputCache 属性?或者我应该替换我的 OutputCache 并改用 DonutCache?
  • 恐怕没办法。上次我需要它时它不可用!
  • @spender 抱歉,请重新阅读它,上面说要替换....今晚我可以在我的项目上进行更多工作时,我会试一试,谢谢。

标签: c# asp.net-mvc asp.net-mvc-4 caching identity


【解决方案1】:

我使用donut caching 库(上面的 cmets 中的 spender 提到)解决了一个非常相似的问题。

一旦您的项目引用了 MvcDonutCaching 库,您就可以调用扩展的 Html.Action 方法将其从缓存中排除,例如

// Action(this HtmlHelper htmlHelper, string actionName, string controllerName, bool excludeFromParentCache)
@Html.Action("LoginStatus", "Home", true) 

为此,您显然需要将不想缓存的部分隔离到它自己的操作和局部视图中。

【讨论】:

  • 所以在我看来,在我的标题中使用内置 Request.IsAutheticated 的当前方法将不起作用,即使使用甜甜圈缓存也是如此。我需要重新考虑,我的标题在所有页面上都必须是静态的......
  • 我看不出有任何原因它不起作用。在您的 _Layout 文件中,您可以用 Html.Action 调用一个控制器方法替换您发布的 HTML,该控制器方法呈现包含 HTML 的局部视图。
  • 哦,我想我只是假设我无法将部分视图放入
  • 元素中......
  • 你几乎可以把它扔到任何你喜欢的地方:)
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签