Frage

Ich spiele zur Zeit mit ASP.net MVC und JQuery um. Ich habe über behavour kommen, die nicht sinnvoll zu sein scheint.

Ich rufe jQuerys $.getJSON Funktion einige divs zu füllen. Die Veranstaltung wird auf dem $(document).ready Ereignisse ausgelöst hat. Dies funktioniert perfekt.

Es gibt einen kleinen AJAX.BeginForm, die einen anderen Wert addiert verwendet werden, wenn die divs bevölkern. Sie ruft die Remote-Funktion korrekt und auf Erfolg ruft die ursprüngliche Javascript-Funktion, die divs neu zu besiedeln.

Hier ist der seltsame Teil: In FireFox und Chrome - Alles funktioniert. Aber IE8 (Beta) dieser zweite Aufruf der bevöl Div Skript (die die $ .getJSON Funktion aufruft) wird Daten zwischengespeichert und fragen Sie den Server nicht!

Hope diese Frage macht Sinn: In einer Nussschale - Warum ist $.getJSON im Cache gespeicherten Daten zu bekommen? Und warum ist es nur IE8 bewirken?

War es hilfreich?

Lösung

Nur, damit Sie wissen, Firefox und Chrome betrachten alle Ajax-Request als nicht-cachable. IE (alle Versionen) behandeln Ajax-Aufruf ebenso wie andere Web-Anfrage. Deshalb sollten Sie dieses Verhalten sehen.
Wie man IE zwingen, Daten bei jeder Anfrage zum Download:

  • Wie Sie gesagt haben, verwenden Sie 'Cache' oder 'nocache' Option in JQuery
  • Fügen Sie einen Zufallsparameter auf die Anforderung (hässlich, aber funktioniert:))
  • Auf Server-Seite eingestellt cachability (zum Beispiel ein Attribut, siehe unten)

Code:

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

Andere Tipps

Dies ist, wie es für mich gearbeitet ...

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

Danke Kent für deine Antwort. Mit $ Schnipsel ( '{cache: no}'); perfekt gearbeitet. [Bearbeiten]

Oder zumindest dachte ich, ich tat. Es scheint, dass der jquery $ .getJSON wird keine Änderungen vorgenommen, um das $ .ajax Objekt zu lesen.

Die Lösung, die Arbeit am Ende war ein neuer Parameter manuell hinzufügen

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

das Datum Auflösung ist nur auf die Minute; die effektiv bedeutet diese Lösung noch für bis zu 1 Minute zwischenspeichert. Dies ist für meine Zwecke.

Ich löste das gleiche Problem von im Controller auf die Aktion das folgende Attribut platzieren:

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

Wenn Sie ASP.net MVC verwenden, sollten Sie eine Erweiterungsmethode Hinzufügen einfacher kein Caching zu implementieren wie folgt:

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

Sie müssen einen Cache-breaker senden.

Ich würde empfehlen, $ Schnipsel ({cache: no}) unter Verwendung nur für den Fall (füge eine zufällige Suffix an die Erhaltungs-Anforderung)

(Ich neige dazu, $ .ajax überall in diesen Tagen zu verwenden, mehr abstimmbar)

bereit für die Antwort?

http://lestopher.tumblr.com/ post / 21742012438 / if-youre-using-IE8-and-getJSON

So fügen Sie einfach

jQuery.support.cors = true;  

am Anfang des Skripts und BANG es funktioniert!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top