2008-11-05 8 views
101

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

Ich rufe JQuery $.getJSON Funktion, um einige divs zu füllen. Das Ereignis wird auf dem Ereignis $(document).ready ausgelöst. Das funktioniert perfekt.

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 bei Erfolg ruft die ursprüngliche JavaScript-Funktion die divs erneut auf.

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

Hoffen Sie, dass diese Frage Sinn ergibt: In einer Nussschale - Warum erhält $.getJSON zwischengespeicherte Daten? Und warum wirkt es nur auf IE8?

+0

Seltsamerweise sehe ich diesen Fehler nicht nur in IE, sondern auch in Firefox. Das Deaktivieren von Ajax-Caching in Jquery hat mir geholfen. –

Antwort

66

Nur um Sie zu informieren, betrachten Firefox und Chrome alle Ajax-Anfragen als nicht cachable. IE (alle Versionen) behandeln Ajax-Aufrufe genauso wie andere Web-Anfragen. Deshalb siehst du dieses Verhalten.
Wie IE zwingen, Daten bei jeder Anfrage zum Download:

  • Wie Sie gesagt haben, verwenden Sie 'Cache' oder 'nocache' Option in JQuery
  • auf die Anfrage einen zufälligen Parameter hinzufügen (hässlich, aber funktioniert:))
  • auf Server-Seite eingestellt cachability (zum Beispiel ein Attribut verwendet, siehe unten)

Code:

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

Diese Lösung spricht mich an. Ich mag die Eleganz der Anwendung einer Attibute in MVC –

+1

Es gibt heutzutage ein OutputCacheAttribute OOTB. – bzlm

+1

@ bzlm, aber dies ist einfacher zu suchen –

2

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

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

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

+0

Danke für deine Antwort! ... ich habe es noch nicht ausprobiert. Gibt in Kürze einen Feed zurück –

16

Danke Kent für Ihre Antwort. Verwenden von $ .ajax ('{cache: no}'); hat perfekt funktioniert. [Bearbeiten]

Oder zumindest dachte ich, dass ich es tat. Scheint, dass die jquery $ .getJSON keine Änderungen am $ .ajax-Objekt liest.

Die Lösung, die Arbeit am Ende war ein neuer Parameter manuell auf die Minute

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

das Datum Auflösung ist nur hinzuzufügen; was bedeutet, dass diese Lösung noch bis zu einer Minute zwischenspeichert. Dies ist für meine Zwecke akzeptabel.

+9

var noCache = new Date(). GetTime(); // wird dir die ms – scunliffe

+0

dank Scunliffe geben! - Ich bin ziemlich neu in Javascript, ASP MVC hat neue Horizonte für mich geöffnet –

+0

Sie können auch etwas wie Math.Random() versuchen. – Falkayn

105

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

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

Ich hatte mit diesem Problem zu kämpfen und Ihre Lösung gab einen schnellen Weg, um es zu lösen. :) Ich habe eine Frage, wissen Sie, welche Optionen für $ .ajaxSetup verwendet werden können? Die jQuery-Dokumentation enthält leider keine Details ... – Achimnol

+1

Die verfügbaren Optionen sind identisch mit $ .ajax Weitere Informationen finden Sie unter http://docs.jquery.com/Ajax/jQuery.ajax#options –

+12

Eine kleine Warnung für den obigen Code - es enthält Race Condition. Da der Aufruf und seine Antwort asynchron sind, sollten Sie '$ .ajaxSetup ({cache: true});' direkt nach dem 'getJSON()' und nicht im Callback aufrufen. – sax

4

Wenn Sie ASP verwenden.net MVC, betrachten eine Erweiterungsmethode Hinzufügen kein Caching auf einfache Weise 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"); 
    } 
+0

Nette Idee - also rufst du diese Erweiterungsmethode auf dem Server während des Callbacks an? – Guy

11

I, indem Sie das folgende Attribut auf die Aktion im Controller das gleiche Problem gelöst:

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

Wunderbar! Großartig, Alternativen zu haben (Ich habe dieses gewählt). Danke an alle Mitwirkenden! –

+0

Arbeitete für mich, danke. Got Love IE – Matt

+0

Funktioniert gut mit Asp.Net MVC 4.0 – Mayank