2008-11-05 4 views
101

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

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

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

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

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

+0

Странно, я вижу эту ошибку не только в IE, но и в Firefox. Мне удалось отключить кэширование ajax в jquery. – 2010-09-15 13:40:22

ответ

66

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

  • Как вы сказали, использование «кэш» или вариант «NoCache» в JQuery
  • Добавить случайный параметр в запросе (уродливый, но работает:))
  • на стороне сервера, установите cachability (например, с использованием атрибута, смотри ниже)

Код:

public class NoCacheAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext context) 
    { 
     context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    } 
} 
+1

Это решение обращается ко мне. Мне очень нравится элегантность применения аттрибута в MVC. – 2008-11-05 23:40:42

2

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

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

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

+0

Спасибо за ваш ответ! ... я еще не пробовал. Скоро отправит фид – 2008-11-05 02:53:17

16

Благодарим Кента за ваш ответ. Использование $ .ajax ('{cache: no}'); работал отлично.

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

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

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

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

+9

var noCache = new Date(). GetTime(); // даст вам мс – scunliffe 2008-11-05 13:44:09

+0

спасибо Scunliffe! - Я довольно новичок в javascript, ASP MVC открыл для меня новые горизонты – 2008-11-05 23:39:22

+0

Вы также можете попробовать что-то вроде Math.Random(). – Falkayn 2009-09-15 01:44:11

105

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

$.ajaxSetup({ cache: false }); 
$.getJSON("/MyQueryUrl",function(data,item) { 
    // do stuff with callback data 
    $.ajaxSetup({ cache: true }); 
    }); 
4

Если вы используете ASP.чистый 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"); 
    } 
11

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

[OutputCache(Duration = 0, VaryByParam = "None")] 
Смежные вопросы