Вопрос

В данный момент я играю с 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;  

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top