OutputCache останавливает отображение моего имени пользователя в заголовке

На моем веб-сайте у меня есть заголовок, определенный в моем _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 ответ

Решение

Я использовал библиотеку кэширования пончиков (упомянутую spender в комментариях выше), чтобы решить очень похожую проблему.

Когда у вашего проекта есть ссылка на библиотеку MvcDonutCaching, вы можете вызвать расширенный Html.Action метод для исключения его из кеша, например

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

Для этого вам, очевидно, потребуется изолировать часть, которую вы не хотите кэшировать, с собственным действием и частичным представлением.

Другие вопросы по тегам