2015-03-12 8 views
2

В моем приложении 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?

ответ

0

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