it-swarm.com.de

$ .getJSON gibt zwischengespeicherte Daten in IE8 zurück

Ich spiele gerade mit ASP.net MVC und JQuery. Ich bin auf Verhalten gestoßen, das keinen Sinn ergibt.

Ich rufe die $.getJSON - Funktion von JQuery auf, um einige divs zu füllen. Das Ereignis wird für das Ereignis $(document).ready ausgelöst. Das funktioniert einwandfrei.

Es gibt einen kleinen AJAX.BeginForm, Der einen weiteren Wert hinzufügt, der beim Auffüllen der divs verwendet wird. Es ruft die Remote-Funktion korrekt auf und ruft bei Erfolg die ursprüngliche Javascript-Funktion auf, um die divs neu zu füllen.

Hier ist der seltsame Teil: In FireFox und Chrome - Alles funktioniert. ABER in IE8 (Beta) wird dieser zweite Aufruf des populate Div-Skripts (das die $ .getJSON-Funktion aufruft) zwischengespeichert und ruft Daten ab fragt den Server nicht!

Hoffe, diese Frage macht Sinn: In einer Nussschale - Warum werden $.getJSON Zwischengespeicherte Daten abgerufen? Und warum wirkt es sich nur auf IE8 aus?

101
Andrew Harry

Um Sie wissen zu lassen, betrachten Firefox und Chrome alle Ajax-Anfragen als nicht zwischenspeicherbar. IE (alle Versionen) behandelt Ajax-Aufrufe wie andere Webanforderungen. Deshalb sehen Sie dieses Verhalten.
So erzwingen Sie, dass IE bei jeder Anforderung Daten herunterlädt:

  • Wie Sie sagten, verwenden Sie in JQuery die Option 'cache' oder 'nocache'
  • Füge der Anfrage einen zufälligen Parameter hinzu (hässlich, funktioniert aber :))
  • Festlegen der Cachefähigkeit auf der Serverseite (z. B. mithilfe eines Attributs, siehe unten)

Code:

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

So hat es bei mir funktioniert ...

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

Danke Kent für deine Antwort. Using $ .ajax ('{cache: no}'); hat einwandfrei funktioniert. [bearbeiten]

Zumindest dachte ich, ich hätte es getan. Scheint, dass die jquery $ .getJSON keine am $ .ajax-Objekt vorgenommenen Änderungen liest.

Die Lösung bestand darin, manuell einen neuen Parameter hinzuzufügen

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

die Datumsauflösung ist nur auf die Minute genau. Dies bedeutet effektiv, dass diese Lösung noch bis zu einer Minute zwischengespeichert wird. Dies ist für meine Zwecke akzeptabel.

16
Andrew Harry

Ich habe das gleiche Problem gelöst, indem ich das folgende Attribut für die Aktion im Controller platziert habe:

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

Wenn Sie ASP.net MVC verwenden, können Sie eine Erweiterungsmethode hinzufügen, um das Zwischenspeichern auf einfache Weise zu unterbinden:

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

Möglicherweise müssen Sie einen Cache-Breaker senden.

Ich würde empfehlen, $ .ajax ({cache: no}) nur für den Fall zu verwenden (fügt der get-Anfrage ein zufälliges Suffix hinzu)

(Ich verwende heutzutage überall $ .ajax, besser einstellbar)

2
Kent Fredric

Bereit für die Antwort?

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

Also einfach hinzufügen

jQuery.support.cors = true;  

am Anfang deines Skripts und BANG klappt es!

2
stadja