Не кеширующее действие [ChildActionOnly] не работает в ASP.NET MVC

В моем приложении ASP.NET MVC у меня есть MenuController с методом Index, украшенным [ChildActionOnly]:

public class MenuController : Controller
{
    [OutputCache(Location=OutputCacheLocation.None, Duration=0, NoStore=true)]
    [ChildActionOnly]
    public PartialViewResult Index()
    {
        return PartialView();
    }
}

Это Index.cshtml частичное представление просто возвращает навигационное меню входа/выхода в зависимости от того, вошел ли пользователь в систему или нет:

@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
    using (Html.BeginForm("logoff", "account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
    {
        @Html.AntiForgeryToken()
        <ul class="nav navbar-nav navbar-right">
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><i class="fa fa-at"></i> @User.Identity.GetUserName() <span class="caret"></span></a>
                <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>
            </li>
        </ul>
    }
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li>@Html.ActionLink("Sign up", "register", "account", routeValues: null, htmlAttributes: new { @class = "btn btn-signup", id = "registerLink" })</li>
        <li>@Html.ActionLink("Log in", "login", "account", routeValues: new { returnUrl = @Request.Path }, htmlAttributes: new { id = "loginLink" })</li>
    </ul>
}

Я вызываю это из моего общего файла _Layout.cshtml как такового:

@{ Html.RenderAction("Index", "Menu"); }

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

public class HomeController : Controller
{
    [OutputCache(CacheProfile = "OneHour", Location=OutputCacheLocation.Server, VaryByParam = "None")]
    public async Task<ActionResult> Index()
    {
        //..some code
        return View(model);
    }

    [ChildActionOnly]
    [OutputCache(Duration = 86400, VaryByParam = "None")]
    public PartialViewResult Other()
    {
        //some code..
        return PartialView(otherModel);
    }
}

... решение не работает: если я перейду на некэшированную страницу, перейду к выходу, а затем вернусь к /Home/Index, меню по-прежнему показывает, что я вошел в систему.

Что мне здесь не хватает? Должен ли MenuController и его вид находиться в папке Shared?


person globetrotter    schedule 12.03.2015    source источник


Ответы (1)


[ChildActionOnly] и [OutputCache(/*with anything other than Duration*/)] очень ограничены в своей реализации из исходного кода фреймворка, вам нужно либо реализовать свой собственный класс атрибутов кеша, используя базовый класс : OutputCacheAttribute, либо создать автоматический выход, когда пользователь закрывает страницу или что-то еще, вот что я могу придумать на данный момент.

person YEH    schedule 06.11.2017