web-dev-qa-db-ja.com

IE8でキャッシュされたデータを返す$ .getJSON

現在、ASP.net MVCとJQueryをいじっています。私は意味をなさないように見える行動に出くわしました。

JQueryの_$.getJSON_関数を呼び出して、いくつかのdivを設定しています。イベントは$(document).readyイベントでトリガーされます。これは完全に機能します。

Divを作成するときに使用される別の値を追加する小さな_AJAX.BeginForm_があります。リモート関数を正しく呼び出し、成功すると元のjavascript関数を呼び出してdivを再設定します。

奇妙な部分は次のとおりです。FireFoxおよびChrome-すべてが動作します。ただし、IE8(ベータ)では、populate Divスクリプト($ .getJSON関数を呼び出す)へのこの2番目の呼び出しはキャッシュされたデータを取得し、サーバーに尋ねません!

この質問が理にかなっていることを願っています:一言で言えば-なぜ_$.getJSON_がキャッシュされたデータを取得するのですか?そして、なぜそれはIE8にしか影響しないのですか?

101
Andrew Harry

お知らせするために、FirefoxとChromeはすべてのAjaxリクエストをキャッシュ不可と見なします。 IE(すべてのバージョン)は、Ajax呼び出しを他のWeb要求と同様に扱います。そのため、この動作が見られます。
リクエストごとにIEにデータをダウンロードさせる方法:

  • あなたが言ったように、JQueryで 'cache'または 'nocache'オプションを使用します
  • リクエストにランダムなパラメーターを追加します(見苦しいですが動作します:))
  • サーバー側で、キャッシュ可能性を設定します(たとえば、属性を使用して、以下を参照)

コード:

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

これは私のために働いた方法です...

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

ケント、答えてくれてありがとう。 $ .ajax( '{cache:no}');の使用完璧に働きました。 [編集]

または、少なくとも私がやったと思った。 jquery $ .getJSONは$ .ajaxオブジェクトに加えられた変更を読み取っていないようです。

動作するようになった解決策は、新しいパラメーターを手動で追加することでした

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

日付の解決はほんのわずかです。つまり、このソリューションは最大1分間キャッシュされます。これは私の目的には受け入れられます。

16
Andrew Harry

コントローラーのアクションに次の属性を配置することで、この同じ問題を解決しました。

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

ASP.net MVCを使用している場合は、次のようにキャッシングなしで簡単に実装するための拡張メソッドを追加することを検討してください。

    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

キャッシュブレーカーを送信する必要がある場合があります。

念のため$ .ajax({cache:no})を使用することをお勧めします(取得リクエストにランダムなサフィックスを追加します)

(私は最近どこでも$ .ajaxを使用する傾向があり、より調整可能です)

2
Kent Fredric

答えの準備はできましたか?

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

だから、追加するだけ

jQuery.support.cors = true;  

スクリプトの冒頭でBANGが機能します!

2
stadja