$ .getJSON devuelve datos en caché en IE8

Estoy jugando con ASP.net MVC y JQuery en este momento. Me he encontrado con un comportamiento que no parece tener sentido.

$.getJSON función $.getJSON JQuery para $.getJSON algunos div. El evento se desencadena en el evento $(document).ready . Esto funciona perfectamente

Hay un pequeño AJAX.BeginForm que agrega otro valor para ser utilizado al poblar los divs. Llama a la función remota correctamente y luego de un éxito llama a la función javascript original para volver a llenar los divs.

Aquí está la parte extraña: en FireFox y Chrome: todo funciona. PERO en IE8 (Beta), esta segunda llamada a la secuencia de comandos Div (que llama a la función $ .getJSON) obtiene datos en caché y no se lo pide al servidor.

Espero que esta pregunta tenga sentido: en $.getJSON : ¿Por qué $.getJSON obtiene datos en caché? ¿Y por qué solo está afectando a IE8?

Para hacerte saber, Firefox y Chrome consideran que todas las solicitudes de Ajax no son de caché. IE (todas las versiones) trata la llamada Ajax como otra solicitud web. Es por eso que ves este comportamiento.
Cómo forzar a IE a descargar datos en cada solicitud:

  • Como dijiste, usa la opción ‘caché’ o ‘nocache’ en JQuery
  • Agregue un parámetro aleatorio a la solicitud (feo, pero funciona :))
  • Del lado del servidor, configure la capacidad de caché (por ejemplo, utilizando un atributo, consulte a continuación)

Código:

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

Así es como funcionó para mí …

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

Gracias Kent por tu respuesta. Usando $ .ajax (‘{caché: no}’); funcionó perfectamente [editar]

O al menos yo pensé que sí. Parece que jquery $ .getJSON no lee ningún cambio realizado en el objeto $ .ajax.

La solución que terminó funcionando fue agregar un nuevo parámetro manualmente

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

la resolución de la fecha es solo por minuto; lo que significa que esta solución todavía almacena en caché hasta por un minuto. Esto es aceptable para mis propósitos.

Resolví este mismo problema al colocar el siguiente atributo en la Acción en el Controlador:

 [OutputCache(Duration = 0, VaryByParam = "None")] 

Si está utilizando ASP.net MVC, considere agregar un método de extensión para implementar fácilmente el almacenamiento en caché de esta manera:

  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"); } 

Es posible que deba enviar un interruptor de memoria caché.

Recomendaría usar $ .ajax ({cache: no}) por si acaso (agrega un sufijo aleatorio a la solicitud get)

(Tiendo a usar $ .ajax en todos lados estos días, más sintonizable)

Listo para la respuesta?

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

Entonces, solo agrega

 jQuery.support.cors = true; 

al comienzo de tu script y ¡BANG funciona!