$ .GetJSON im Cache gespeicherten Daten in IE8 Rückkehr
-
06-07-2019 - |
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?
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!