Отключить кэширование при частичном просмотре в MVC 3 - PullRequest
20 голосов
/ 09 января 2012

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

@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, даже если пользователь не вошел в систему и т. Д. Есть ли способ кэшировать весь контент, кроме рассматриваемого частичного представления?

Ответы [ 5 ]

18 голосов
/ 09 января 2012

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

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult HeaderView()
{
    return PartialView("_HeaderView");
}
9 голосов
/ 09 января 2012

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

3 голосов
/ 02 сентября 2014

Мы должны установить профиль кэша в файле 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");
}

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

1 голос
/ 10 февраля 2017

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


    @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
    {
    }

1 голос
/ 08 января 2015

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

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