ASP MVC 3 OutputCache избежать кэширования текущего запроса - PullRequest
2 голосов
/ 07 февраля 2012

Я начал использовать OutputCache для своего сайта.Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь обновляет элемент, мне нужно сбросить кэш для этого элемента.

Я сделал это, используя:

var urlToRemove = Url.Action("Details", "Dress", new {id = model.Id});
Response.RemoveOutputCacheItem(urlToRemove);

В действии «Правка» я также установил наTempData сообщение об успешном обновлении, и я отображаю его при следующем запросе.Проблема в том, что сообщение остается в кэшированном ответе.

Знаете ли вы, как я могу избежать кэширования в действии.Что-то вроде:

[OutputCache(Duration = 3600, VaryByParam = "id")]
public ViewResult Details(int id)
{  
  if(NotificationHelper.HasNotifications)
    Response.DoNotCache();
    .....

Я не могу использовать тот же трюк ... потому что страница добавляется в кеш после ее рендеринга.Поэтому я не могу исключить действие из кэша в его теле.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

То, что вы описываете, иногда называют «кэшированием пончиковых отверстий», потому что вы хотите кэшировать все, кроме некоторого динамического содержимого в середине.

Вот пара ресурсов, на которые вы можете посмотреть:

0 голосов
/ 02 февраля 2015

что по этому поводу?

class CustomOutputCacheAttribute : OutputCacheAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Response.StatusCode >= 400)
        {
            this.Location = System.Web.UI.OutputCacheLocation.None;
            this.Duration = -1;
        }

        filterContext.HttpContext.Response.Cache.SetOmitVaryStar(true);
        base.OnActionExecuted(filterContext);
    }

}
0 голосов
/ 08 февраля 2012

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

...