$.getJSON возвращает кэшированные данные в IE8
-
06-07-2019 - |
Вопрос
В данный момент я играю с ASP.net MVC и jQuery.Я столкнулся с поведением, которое, кажется, не имеет смысла.
Я звоню в jQuery $.getJSON
функция для заполнения некоторых элементов div.Событие запускается на $(document).ready
событие.Это работает отлично.
Есть небольшой AJAX.BeginForm
который добавляет еще одно значение, которое будет использоваться при заполнении divs.Он корректно вызывает удаленную функцию и в случае успеха вызывает исходную функцию javascript для повторного заполнения divs.
Вот самая странная часть:В FireFox и Chrome - Все работает.НО в IE8 (бета-версия) этот второй вызов скрипта populate Div (который вызывает функцию $.getJSON) получает кэшированные данные и не запрашивает сервер!
Надеюсь, этот вопрос имеет смысл:В ореховой скорлупе - Почему $.getJSON
получение кэшированных данных?И почему это влияет только на IE8?
Решение
Просто, чтобы вы знали, Firefox и Chrome рассматривают все Ajax-запросы как недоступные для кэширования.IE (все версии) обрабатывает вызов Ajax так же, как и другой веб-запрос.Вот почему вы видите такое поведение.
Как заставить IE загружать данные при каждом запросе:
- Как вы сказали, используйте опцию "кэш" или "nocache" в jQuery
- Добавьте случайный параметр в запрос (некрасиво, но работает :))
- На стороне сервера задайте кэшируемость (например, с помощью атрибута, см. Ниже).
Код:
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
}
Другие советы
Вот как это работает для меня ...
$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
// do stuff with callback data
$.ajaxSetup({ cache: true });
});
Спасибо, Кент, за ответ. Использование $ .ajax ('{cache: no}'); работал отлично. [Править]
Или, по крайней мере, я так думал. Похоже, что jquery $ .getJSON не читает никаких изменений, внесенных в объект $ .ajax.
Решение, которое закончилось работой, состояло в том, чтобы добавить новый параметр вручную
var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);
разрешение даты - только с точностью до минуты; что фактически означает, что это решение все еще кэшируется в течение одной минуты. Это приемлемо для моих целей.
Я решил эту же проблему, поместив следующий атрибут в действие в контроллере:
[OutputCache(Duration = 0, VaryByParam = "None")]
Если вы используете ASP.net MVC, рассмотрите возможность добавления метода расширения, чтобы легко реализовать отсутствие кэширования, например:
public static void NoCache(this HttpResponse Response)
{
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.MinValue);
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetValidUntilExpires(false);
Response.Expires = -1;
Response.ExpiresAbsolute = DateTime.MinValue;
Response.AddHeader("Cache-Control", "no-cache");
Response.AddHeader("Pragma", "no-cache");
}
Возможно, вам потребуется отправить кеш-прерыватель. Р>
Я бы порекомендовал использовать $ .ajax ({cache: no}) на всякий случай (добавляет случайный суффикс к запросу get)
(я обычно использую $ .ajax везде, более настраиваемый)
Готов к ответу?
http://lestopher.tumblr.com/ запись / 21742012438 / если-Youre-используя-ie8-и-getjson р>
Итак, просто добавьте
jQuery.support.cors = true;
в начале вашего скрипта и БАХ это работает!