$.помощью метода getjson возвращаясь кэшированных данных в IE8
Я играю вокруг с ASP.net MVC и JQuery на данный момент. Я столкнулся с поведением, которое, кажется, не имеет смысла.
Я звоню в JQuery для заполнения некоторых див по. Событие происходит на $(document).ready
событие. Это прекрасно работает.
есть маленький AJAX.BeginForm
что добавляет еще одно значение, которое будет использоваться при заполнении divs. Он вызывает удаленную функцию правильно и после успеха вызывает исходную функцию javascript для повторного заполнения элементы div.
вот странная часть: в FireFox и Chrome - все работает. Но в IE8 (бета) это второй вызов для заполнения div-скрипта (который вызывает $.функция getJSON) получает кэшированные данные и не запрашивает сервер!
надеюсь, этот вопрос имеет смысл: в скорлупе ореха-почему это $.getJSON
получение кэшированных данных? И почему это только влияет на IE8?
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;
в начале вашего скрипта и ура он работает !