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?

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top