В моем приложении ASP.NET MVC, у меня есть MenuController
с Index
методом украшенной [ChildActionOnly]
:Не кэшировать [ChildActionOnly] действие не работает в ASP.NET MVC
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
меню по-прежнему показывает me as вошел в систему.
Что мне здесь не хватает? Должно ли MenuController
и его вид быть в папке Shared
?