Отключить кэширование на частичном представлении в 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 { }