OutputCache阻止我的用户名显示在标题中

时间:2014-05-01 12:13:46

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

在我的网站上,我在_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();
        }
    }

1 个答案:

答案 0 :(得分:1)

我使用donut caching库(在上面的评论中由spender提到)来解决一个非常类似的问题。

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

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

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