IE8でキャッシュされたデータを返す$ .getJSON
-
06-07-2019 - |
質問
現在、ASP.net MVCとJQueryをいじっています。私は意味をなさないように見える行動に出くわしました。
JQueryの $。getJSON
関数を呼び出して、いくつかのdivを設定しています。このイベントは、 $(document).ready
イベントでトリガーされます。これは完全に機能します。
小さな AJAX.BeginForm
があり、divを作成するときに使用される別の値を追加します。リモート関数を正しく呼び出し、成功すると元のjavascript関数を呼び出してdivを再設定します。
これは奇妙な部分です。FireFoxとChromeでは、すべてが機能します。しかし、IE8(ベータ版)では、populate Divスクリプト($ .getJSON関数を呼び出す)へのこの2番目の呼び出しは、キャッシュされたデータを取得し、サーバーに問い合わせません!
この質問が理にかなっていることを願っています:簡単に言えば- $。getJSON
がキャッシュされたデータを取得するのはなぜですか?そして、なぜそれはIE8にのみ影響するのですか?
解決
お知らせしたいのは、FirefoxとChromeはすべてのAjaxリクエストをキャッシュ不可とみなすことです。 IE(すべてのバージョン)は、Ajax呼び出しを他のWeb要求と同様に扱います。そのため、この動作が見られます。
IEにリクエストごとにデータをダウンロードさせる方法:
- あなたが言ったように、JQueryで 'cache'または 'nocache'オプションを使用します
- ランダムなパラメーターをリクエストに追加します(ugいですが、動作します:))
- サーバー側で、キャッシュ可能性を設定します(たとえば、属性を使用、以下を参照)
コード:
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
}
他のヒント
これは私のために働いた方法です...
$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
// do stuff with callback data
$.ajaxSetup({ cache: true });
});
ケント、ご回答ありがとうございます。 $ .ajax( '{cache:no}');の使用完璧に働きました。 [編集]
または少なくとも私はそう思った。 jquery $ .getJSONは$ .ajaxオブジェクトに加えられた変更を読み取っていないようです。
動作するようになった解決策は、新しいパラメーターを手動で追加することでした
var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);
日付の解決は分までです。つまり、このソリューションは最大1分間キャッシュされ続けます。これは私の目的には受け入れられます。
コントローラーのアクションに次の属性を配置することで、この同じ問題を解決しました。
[OutputCache(Duration = 0, VaryByParam = "None")]
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");
}
キャッシュブレーカーを送信する必要がある場合があります。
念のため、$。ajax({cache:no})を使用することをお勧めします(取得リクエストにランダムなサフィックスを追加します)
(私は最近どこでも$ .ajaxを使用する傾向があり、より調整可能です)
答えの準備はできましたか
http://lestopher.tumblr.com/ post / 21742012438 / if-youre-using-ie8-and-getjson
したがって、追加するだけ
jQuery.support.cors = true;
スクリプトの冒頭でBANGが機能します!