Отключить кэширование на частичном представлении в MVC 3

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

@if(Request.IsAuthenticated) {    
    <a href="@Url.Action("LogOff", "Account", new { area = "" })">Log Off</a> 
}
else {
    <a href="@Url.Action("LogOn", "Account", new { area = "" })">Log On</a>
}

это частичное представление вызывается со всех страниц в моем приложении MVC3, используя

@Html.Partial("_HeaderView")  

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

[OutputCache(Duration = 86400, VaryByParam = "*")]

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

5 ответов


то, что вы ищете, называется кэшированием пончиков. Вот отличная статья, объясняющая, что это такое и как заставить его работатьhttp://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3


вы можете отключить кэширование, украсив контроллер, который отображает ваш _headerview partial следующим образом:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult HeaderView()
{
    return PartialView("_HeaderView");
}

мы должны установить профиль кэша в веб.файл конфигурации вместо установки значений кэша по отдельности на страницах, чтобы избежать избыточного кода. Мы можем ссылаться на профиль с помощью свойства CacheProfile атрибута OutputCache. Этот профиль кэша будет применен ко всем страницам, если страница / метод не переопределит эти параметры.

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="CacheProfile" duration="60" varyByParam="*" />
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>

и если вы хотите отключить кэширование из своего действия, которое возвращает частичное представление [_HeaderView], вы можете переопределить параметры кэша конфигурации украшение этого конкретного метода действия, как показано ниже:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult RenderPartialView()
{
    return PartialView("_HeaderView");
}

надеюсь, это поможет вам!


это работает для меня..

 public ActionResult LogOff()
 {
     AuthenticationManager.SignOut();  
     var url = Url.Action("Index", "Web"); 
     HttpResponse.RemoveOutputCacheItem(url);           
     return RedirectToAction("Index", "Web");
 }

потребовалось некоторое время, чтобы понять это после возвращения в MVC. Просто поместите настройку кэша непосредственно в частичное представление заголовка. Как при отображении имени пользователя. Нет необходимости в глобальном или серверном коде. Проблема только в том, что после кэширования страницы она не будет обновляться сразу после входа в систему. Но мы сохраняем скорость при необходимости в первоначальном просмотре продуктов. Хорошо, в нашем случае.


    @if ( Request.IsAuthenticated)
    {
            @* when we are authenticated, don't cache any more! *@
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Cache.SetNoStore();
    HttpContext.Current.Response.Cache.SetNoServerCaching();
            @*@Html.Raw(DateTime.Now.ToString())*@
    @Html.ActionLink("Welcome " + ( String.IsNullOrEmpty(((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")) ? User.Identity.Name : ((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")), "Index", "Manage", routeValues: new { Area = "Store" }, htmlAttributes: new { title = "Manage"})
    }
    else
    {
    }