102

現在、ASP.netMVCとJQueryで遊んでいます。意味をなさないような振る舞いに出くわしました。

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

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

ここに奇妙な部分があります:FireFoxとChromeでは-すべてが機能します。しかし、IE8(ベータ版)では、データの入力($ .getJSON関数を呼び出す)へのこの2回目の呼び出しは、キャッシュされたデータを取得し、サーバーに要求しません!

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

4

7 に答える 7

107

これが私にとってどのように機能したかです...

$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
     // do stuff with callback data
     $.ajaxSetup({ cache: true });
   });
于 2008-12-11T00:16:41.853 に答える
67

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

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

コード:

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
于 2008-11-05T09:09:40.613 に答える
16

ケントさん、ご回答ありがとうございます。$.ajax('{ cache: no }'); の使用 完璧に機能しました。[編集]

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

最終的に機能した解決策は、新しいパラメーターを手動で追加することでした

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

日付の解像度は分単位です。これは事実上、このソリューションが最大 1 分間キャッシュすることを意味します。これは私の目的には受け入れられます。

于 2008-11-05T04:35:40.400 に答える
11

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

[OutputCache(Duration = 0, VaryByParam = "None")]
于 2009-08-13T03:49:30.363 に答える
4

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");
    }
于 2009-05-11T16:55:36.200 に答える
2

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

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

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

于 2008-11-05T02:51:30.377 に答える
2

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

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

したがって、追加するだけです

jQuery.support.cors = true;  

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

于 2012-05-29T07:44:31.710 に答える