Как лучше всего обращаться с кешем и кнопкой возврата браузера? - PullRequest
8 голосов
/ 22 августа 2008

Как лучше всего обработать возвращение пользователя на страницу с кэшированными элементами в приложении asp.net? Есть ли хороший способ захватить кнопку возврата (событие?) И обработать кеш таким образом?

Ответы [ 5 ]

7 голосов
/ 23 августа 2008

Вы можете попробовать использовать свойство HttpResponse.Cache , если это поможет:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
   //...
}

Или может блокировать кеширование страницы вместе с HttpResponse.CacheControl , но его не рекомендуется использовать в пользу свойства Cache выше:

Response.CacheControl = "No-Cache";

Редактировать: ИЛИ вы могли бы действительно сходить с ума и делать все это вручную:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1 
6 голосов
/ 22 августа 2008

Насколько я знаю (или, по крайней мере, прочитал), лучше всего стараться не работать в ответ на пользовательские события, а думать «на странице» ..

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

Т.е., если на шаге 3 выполняются некоторые изменения данных, то пользователь щелкает назад (к шагу 2) и снова щелкает на следующем, затем приложение проверяет, были ли внесены изменения. Или, в идеале, оно не делает никаких hard изменяется до тех пор, пока пользователь не нажмет "ОК" в конце. Таким образом, все изменения будут сохранены, и вы сможете повторно заполнить форму на основе ранее введенных значений при загрузке, каждый раз ..

Надеюсь, это имеет смысл:)

2 голосов
/ 20 октября 2008

RFC 2616 §13.13 говорит, что История и кэш - это разные вещи . У кеша не должно быть абсолютно никакого способа повлиять на кнопку Назад.

Если какая-либо комбинация заголовков HTTP влияет на кнопку Назад, это ошибка в браузере ... с одним исключением.

В HTTP S браузеры интерпретируют Cache-control: must-revalidate как запрос на обновление страниц при использовании кнопки «Назад» (Mozilla называет это «режимом глупого банка»). Это не поддерживается в простом HTTP.

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

Следующий код работал для меня в IE9 +, FF21 и Latest Chrome:

Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();

Вы можете поместить это в Page_Load() обработчик событий в MasterPage, чтобы при нажатии кнопки «Назад» на каждой странице вашего приложения требовался обмен данными с сервером.

0 голосов
/ 22 августа 2008

Лучший способ справиться с этим - это, вероятно, поместить директиву no-cache в ваши страницы ASP.NET (или в главную страницу, если вы ее используете). Я не думаю, что есть способ решить эту проблему непосредственно в вашем коде ASP.NET (поскольку решение о кэше происходит на клиенте).

Что касается MVC, не знаю, как бы вы этого достигли (при условии, что он отличается от ASP.NET на основе веб-форм); Я не использовал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...