$.помощью метода getjson возвращаясь кэшированных данных в IE8


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

Я звоню в JQuery для заполнения некоторых див по. Событие происходит на $(document).ready событие. Это прекрасно работает.

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

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

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

7 101

7 ответов:

просто чтобы вы знали, 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);
    }
}

вот как это работало для меня...

$.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)

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

готов к ответу ?

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

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

jQuery.support.cors = true;  

в начале вашего скрипта и ура он работает !