Подтвердить что ты не робот

Отключить кеширование на частичном представлении в 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 = "*")]

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

4b9b3361

Ответ 2

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

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

Ответ 3

Мы должны установить профиль кэша в файле Web.config, а не устанавливать значения кеша индивидуально на страницах, чтобы избежать избыточного кода. Мы можем ссылаться на профиль, используя свойство 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");
}

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

Ответ 4

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

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

Ответ 5

Понадобилось немного времени, чтобы понять это после возвращения в 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
    {
    }