$ .getJSON IE8'de önbelleğe alınmış verileri döndürüyor


102

Şu anda ASP.net MVC ve JQuery ile uğraşıyorum. Mantıklı görünmeyen davranışlarla karşılaştım.

$.getJSONBazı div'leri doldurmak için JQuery'nin işlevini arıyorum . Olay, olay üzerine tetiklenir $(document).ready. Bu mükemmel çalışıyor.

AJAX.BeginFormDiv'leri doldururken kullanılacak başka bir değer ekleyen bir küçük var. Uzak işlevi doğru bir şekilde çağırır ve başarı üzerine div'leri yeniden doldurmak için orijinal javascript işlevini çağırır.

İşin tuhaf kısmı şudur: FireFox ve Chrome'da - Her şey çalışıyor. AMA IE8'de (Beta), Div komut dizisine yapılan bu ikinci çağrı ($ .getJSON işlevini çağırır) önbelleğe alınan verileri alır ve sunucuya sormaz!

Umarım bu soru mantıklıdır: Özet olarak - Neden $.getJSONönbelleğe alınmış veriler alınıyor? Ve neden sadece IE8'i etkiliyor?


Garip bir şekilde, bu hatayı yalnızca IE'de değil, Firefox'ta da görüyorum. Jquery'de ajax önbelleğe almayı devre dışı bırakmak bana yardımcı oldu.
Josef Sábl

Yanıtlar:


67

Firefox ve Chrome, tüm Ajax isteklerini önbelleğe alınamaz olarak kabul eder. IE (tüm sürümler) Ajax çağrısını diğer web istekleri gibi ele alır. Bu yüzden bu davranışı görüyorsunuz.
IE'yi her istekte verileri indirmeye zorlama:

  • Dediğiniz gibi, JQuery'de 'önbellek' veya 'nocache' seçeneğini kullanın
  • İsteğe rastgele bir parametre ekleyin (çirkin ama işe yarıyor :))
  • Sunucu tarafında, önbelleğe alınabilirliği ayarlayın (örneğin bir öznitelik kullanarak, aşağıya bakın)

Kod:

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

1
Bu çözüm bana hitap ediyor. MVC'de bir nitelik uygulamanın zarafetini gerçekten seviyorum
Andrew Harry

1
Günümüzde bir OutputCacheAttribute OOTB var.
bzlm

1
@bzlm ama bu aramak daha kolaydır
Simon_Weaver

kontrol formatinternet.wordpress.com/2010/01/14/... bir istemci tarafında çözüm
Ivo

1
Aslında tam tersi, ancak bir geliştirici olarak IE'nin sabır gerektirdiğini kabul ediyorum :)
Nico

107

Benim için böyle çalıştı ...

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

Bu problemle uğraşıyordum ve çözümünüz onu çözmenin hızlı bir yolunu verdi. :) Bir sorum var, $ .ajaxSetup için hangi seçeneklerin kullanılabileceğini biliyor musunuz? jQuery belgeleri ne yazık ki ayrıntıları
sağlamıyor

1
Mevcut seçenekler $ .ajax ile aynıdır Daha fazla bilgi için docs.jquery.com/Ajax/jQuery.ajax#options adresine bakın
Dan Esparza

12
Yukarıdaki kod için küçük bir uyarı - yarış durumunu içerir. Çağrı ve yanıtı eşzamansız olduğundan, çağrıdan $.ajaxSetup({ cache: true });hemen sonra aramalısınız . getJSON() geri .
saksafon

16

Cevabınız için teşekkürler Kent. $ .Ajax ('{cache: no}') kullanarak; mükemmel çalıştı. [Düzenle]

Ya da en azından yaptığımı sandım. $ .GetJSON jquery $ .ajax nesnesine yapılan değişiklikleri okumuyor gibi görünüyor.

Çalışmaya başlayan çözüm, manuel olarak yeni bir parametre eklemekti

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

tarih çözünürlüğü sadece dakikadır; Bu da etkili bir şekilde bu çözümün bir dakikaya kadar önbelleğe alınacağı anlamına gelir. Bu benim amaçlarım için kabul edilebilir.


9
var noCache = new Date (). getTime (); // size ms vereceğim
scunliffe

teşekkürler Scunliffe! - JavaScript'te oldukça yeniyim, ASP MVC benim için yeni ufuklar açtı
Andrew Harry

Math.Random () gibi bir şey de deneyebilirsiniz.
Falkayn

@Falkayn - zor Math.Random()kullanılabilir, sonuçları bilinmeyecektir ve aynı sayıyı arka arkaya iki kez (veya daha fazla) alabilirsiniz. kullanmak new Date().getTime(), bunun asla tekrarlanmamasını sağlayacaktır. (zamanda geri dönemezseniz;))
Rafael Herscovici

11

Denetleyicideki Eylem'e aşağıdaki özniteliği yerleştirerek aynı sorunu çözdüm:

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

Olağanüstü! Alternatiflere sahip olmak harika (bunu seçtim). Tüm katkıda bulunanlara teşekkürler!
Anders Juul

Asp.Net MVC 4.0 ile sorunsuz çalışıyor
Mayank

4

ASP.net MVC kullanıyorsanız, böyle bir önbelleğe alma işlemini kolayca uygulamak için bir uzantı yöntemi eklemeyi düşünün:

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

Güzel fikir - bu yüzden geri arama sırasında sunucuda bu uzantı yöntemini çağırıyorsunuz değil mi?
Guy

2

Bir önbellek kesici göndermeniz gerekebilir.

Her ihtimale karşı $ .ajax ({cache: no}) kullanmanızı tavsiye ederim (alma isteğine rastgele bir son ek ekler)

(Bugünlerde her yerde $ .ajax kullanma eğilimindeyim, daha ayarlanabilir)


Cevabınız için teşekkürler! ... Henüz denemedim. Kısa bir süre sonra geri bildirim sağlayacak
Andrew Harry

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.