Как отключить кеширование в модальных диалогах в IE? - PullRequest
9 голосов
/ 01 декабря 2008

Мы реализовали всплывающее окно как модальное диалоговое окно, используя метод IE:

window.showModalDialog('...aspx')

Цель всплывающего окна - сама веб-страница ASP.Net.

Предположим для следующих шагов, что всплывающее окно никогда не запускалось:

  1. Запустить всплывающее окно.
  2. Обработчик события Page_Load выполняется на стороне сервера.
  3. Закрыть всплывающее окно.
  4. Немедленно снова запустить всплывающее окно.
  5. На этот раз обработчик событий Page_Load не выполняется.

Понятно, что всплывающее содержимое кэшируется, потому что если на шаге 4 мы очищаем временные интернет-файлы, обработчик события Page_Load выполняется второй раз.

Мы экспериментировали с добавлением следующего в заголовок веб-страницы (как рекомендовано несколькими другими источниками), но, похоже, ничего из этого не работает.

<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />

Мы также видели места, где их использование не поощряется

Кто-нибудь может помочь?

Ответы [ 9 ]

9 голосов
/ 01 декабря 2008

Добавьте переменную строки запроса временной метки к URL-адресу содержимого диалога - количество тиков с 01.01.08 или около того - IE будет обрабатывать ее как новую страницу и игнорировать кеш.

8 голосов
/ 26 февраля 2010

Чтобы очистить кеш, добавьте это в загрузку страницы:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
4 голосов
/ 02 декабря 2008

Учитывая, что директивы http-эквивалент не работают (и, возможно, не должны использоваться), и, несмотря на то, что, к сожалению, они относятся к категории хакерских решений, я думаю, что нам придется пойти на это Greg) ...

url = "<Some url with query string>"
var date = new Date();
window.showModalDialog(url + “&” + date.getTime(), ... );

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

Спасибо за ваши предложения.

2 голосов
/ 04 октября 2011

Сначала я попробовал использовать следующий код.

meta http-equiv="Cache-Control" content="no-cache" 
meta http-equiv="Pragma" content="no-cache" 
meta http-equiv="Expires" content="-1" 

но не было никакого решения после того, как я попробовал использовать строку запроса с переменной отметки времени как

vat time = new Date().getTime();

url?queryString&time=time

тогда это работает ....

Спасибо ...

2 голосов
/ 01 декабря 2008

Поместите Fiddler между IE и вашим сервером. Затем проверьте, содержит ли ответ на ваш запрос HTTP-заголовок Cache-Control . Есть ли какое-либо значение, отличное от no-cache ? Если это так, то, возможно, IE даст этому заголовку приоритет над вашей директивой http-эквивалента .

Если нет, попытайтесь заставить сервер отправлять заголовок HTTP Cache-Control: no-cache . Если IE не уважает это, это ошибка в IE. Опыт показывает, что менее сложно выбрать другое решение, чем настаивать на исправлении, поэтому в этом случае я бы согласился с подсказкой Грега.

1 голос
/ 02 февраля 2011

вы забыли тег для повторной обработки страницы.

<base target="_top" />

если поставить теги ниже, кеш будет очищен:

<meta http-equiv="Expires" content="0" />
<meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<base target="_top" />
0 голосов
/ 09 августа 2012

Вы также можете попробовать следующий оператор в верхней части вызываемой страницы aspx:

<%@ OutputCache Location="None" %>
0 голосов
/ 18 мая 2012

Ответ Response.Cache.SetCacheability (HttpCacheability.NoCache); это единственный, который работает правильно с IE9. Если вы установили метку времени в строке запроса, вам все равно придется обновить страницу, чтобы получить другой URL. Таким образом, модальное диалоговое окно все еще кэшируется до тех пор, пока страница не будет обновлена, если вы не используете Response.Cache.SetCacheability (HttpCacheability.NoCache); Использование метки времени в URL и Response.Cache.SetCacheability (HttpCacheability.NoCache); было бы лучше, охватить все базы. В конце концов, мы имеем дело с IE.

0 голосов
/ 07 января 2009

Одна из странных особенностей IE заключается в том, что установка no-cache в начале файла, похоже, не работает, но перемещение этого раздела после исходного HTML часто делает. Лучше всего отправить его в виде заголовка HTTP, но в большинстве случаев будет работать следующее:

<html>
   <head><title>Blah</title></head>
   <body>Contents</body>
</html>
<html>
   <head>
      <meta http-equiv="Cache-Control" content="no-cache" />
      <meta http-equiv="Pragma" content="no-cache" />
      <meta http-equiv="Expires" content="-1" />
   </head>
</html>
...