$ .getJSON, возвращающий кэшированные данные в IE8 - PullRequest
101 голосов
/ 05 ноября 2008

Я сейчас играю с ASP.net MVC и JQuery. Я сталкивался с поведением, которое, кажется, не имеет смысла.

Я вызываю функцию JQuery $.getJSON, чтобы заполнить некоторые элементы div. Событие инициируется событием $(document).ready. Это отлично работает.

Существует небольшое значение AJAX.BeginForm, которое добавляет другое значение, которое будет использоваться при заполнении элементов div. Он правильно вызывает удаленную функцию, а в случае успеха вызывает исходную функцию javascript для повторного заполнения элементов div.

Вот странная часть: в FireFox и Chrome - все работает. НО В IE8 (бета-версия) этот второй вызов сценария заполнения Div (который вызывает функцию $ .getJSON) получает кэшированные данные и не запрашивает сервер!

Надеюсь, этот вопрос имеет смысл: в ореховой оболочке - почему $.getJSON получает кэшированные данные? И почему это влияет только на IE8?

Ответы [ 7 ]

105 голосов
/ 11 декабря 2008

Вот как у меня это работало ...

$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
     // do stuff with callback data
     $.ajaxSetup({ cache: true });
   });
66 голосов
/ 05 ноября 2008

Просто чтобы вы знали, Firefox и Chrome считают все запросы Ajax не кэшируемыми. IE (все версии) обрабатывают Ajax-вызов так же, как и другие веб-запросы. Вот почему вы видите это поведение.
Как заставить IE загружать данные при каждом запросе:

  • Как вы сказали, используйте опцию 'cache' или 'nocache' в JQuery
  • Добавить в запрос случайный параметр (некрасиво, но работает :))
  • На стороне сервера установите кэшируемость (например, с помощью атрибута, см. Ниже)

Код:

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
16 голосов
/ 05 ноября 2008

Спасибо, Кент, за ответ. Использование $ .ajax ('{cache: no}'); работал отлично. [Править]

Или, по крайней мере, я так думал. Кажется, что jquery $ .getJSON не читает никаких изменений, внесенных в объект $ .ajax.

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

var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);

разрешение даты указывается только с точностью до минуты; что фактически означает, что это решение все еще кэшируется в течение одной минуты. Это приемлемо для моих целей.

11 голосов
/ 13 августа 2009

Я решил эту же проблему, поместив следующий атрибут в действие в контроллере:

[OutputCache(Duration = 0, VaryByParam = "None")]
4 голосов
/ 11 мая 2009

Если вы используете 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");
    }
2 голосов
/ 29 мая 2012

Готов к ответу?

http://lestopher.tumblr.com/post/21742012438/if-youre-using-ie8-and-getjson

Итак, просто добавьте

jQuery.support.cors = true;  

в начале вашего скрипта и БАХ это работает!

2 голосов
/ 05 ноября 2008

Возможно, вам потребуется отправить кеш-прерыватель.

Я бы рекомендовал использовать $ .ajax ({cache: no}) на всякий случай (добавляет случайный суффикс к запросу get)

(Я обычно использую $ .ajax везде, более настраиваемый)

...