$ .getJSON restituisce i dati memorizzati nella cache in IE8
-
06-07-2019 - |
Domanda
Al momento sto giocando con ASP.net MVC e JQuery. Mi sono imbattuto in un comportamento che non sembra avere senso.
Sto chiamando la funzione $ .getJSON
di JQuery per popolare alcuni div. L'evento viene attivato sull'evento $ (document) .ready
. Funziona perfettamente.
Esiste un piccolo AJAX.BeginForm
che aggiunge un altro valore da utilizzare quando si popolano i div. Chiama correttamente la funzione remota e in caso di successo chiama la funzione javascript originale per ripopolare i div.
Ecco la parte strana: in FireFox e Chrome - Tutto funziona. MA In IE8 (Beta) questa seconda chiamata allo script Div popolato (che chiama la funzione $ .getJSON) ottiene i dati memorizzati nella cache e non chiede al server!
Spero che questa domanda abbia un senso: in breve - Perché $ .getJSON
sta ottenendo i dati memorizzati nella cache? E perché ha effetto solo su IE8?
Soluzione
Solo per farti sapere, Firefox e Chrome considerano tutte le richieste Ajax non invalicabili. IE (tutte le versioni) considera la chiamata Ajax come un'altra richiesta web. Ecco perché vedi questo comportamento.
Come forzare IE a scaricare i dati ad ogni richiesta:
- Come hai detto, usa l'opzione 'cache' o 'nocache' in JQuery
- Aggiungi un parametro casuale alla richiesta (brutto, ma funziona :))
- Sul lato server, imposta la cachability (ad esempio utilizzando un attributo, vedi sotto)
Codice:
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
}
Altri suggerimenti
Ecco come ha funzionato per me ...
$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
// do stuff with callback data
$.ajaxSetup({ cache: true });
});
Grazie Kent per la tua risposta. Utilizzando $ .ajax ('{cache: no}'); ha funzionato perfettamente. [Modifica]
O almeno pensavo di averlo fatto. Sembra che jquery $ .getJSON non stia leggendo alcuna modifica apportata all'oggetto $ .ajax.
La soluzione che ha funzionato è stata l'aggiunta manuale di un nuovo parametro
var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);
la risoluzione della data è solo al minuto; il che significa che questa soluzione viene memorizzata nella cache per un massimo di un minuto. Questo è accettabile per i miei scopi.
Ho risolto lo stesso problema inserendo il seguente attributo nell'Azione nel Controller:
[OutputCache(Duration = 0, VaryByParam = "None")]
Se stai usando ASP.net MVC, considera l'aggiunta di un metodo di estensione per implementare facilmente nessuna cache in questo modo:
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");
}
Potrebbe essere necessario inviare un interruttore di cache.
Consiglio di usare $ .ajax ({cache: no}) per ogni evenienza (aggiunge un suffisso casuale alla richiesta get)
(Tendo a usare $ .ajax ovunque in questi giorni, più sintonizzabile)
Pronto per LA risposta?
http://lestopher.tumblr.com/ postale / 21742012438 / se-sei-con-IE8-e-getJSON
Quindi, basta aggiungere
jQuery.support.cors = true;
all'inizio della tua sceneggiatura e BANG funziona!