Pregunta

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

Llamo a la función $ .getJSON de JQuery para completar 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 usar cuando se llenan los divs. Llama a la función remota correctamente y, en caso de éxito, llama a la función javascript original para repoblar los divs.

Aquí está la parte extraña: en Firefox y Chrome: todo funciona. PERO En IE8 (Beta), esta segunda llamada al script Div de poblado (que llama a la función $ .getJSON) obtiene datos en caché y no pregunta al servidor.

Espero que esta pregunta tenga sentido: en pocas palabras: ¿por qué $ .getJSON obtiene datos almacenados en caché? ¿Y por qué solo afecta a IE8?

¿Fue útil?

Solución

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

  • Como dijiste, usa la opción 'cache' o 'nocache' en JQuery
  • Agregue un parámetro aleatorio a la solicitud (feo, pero funciona :))
  • En el lado del servidor, establezca la capacidad de almacenamiento en 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);
    }
}

Otros consejos

Así es como me funcionó ...

$.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 eso pensé. 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 efectivamente significa que esta solución aún se almacena en caché por hasta un minuto. Esto es aceptable para mis propósitos.

Resolví este mismo problema colocando 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 sin 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 caché.

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

(tiendo a usar $ .ajax en todas partes en estos días, más sintonizable)

¿Listo para LA respuesta?

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

Entonces, solo agregue

jQuery.support.cors = true;  
¡

al comienzo de tu script y BANG funciona!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top