2012-01-13 12 views
5

ChromeとFFで完璧に機能するツールがあります。しかし、IEのどのバージョンでも、ブラウザはデータを取得するためにAjaxをプルするよりもキャッシュ情報を表示しています。 Iループを通っている私はのcriteriasを持ってAjax経由でキャッシュデータを表示するInternet Explorer 304の結果

@foreach (var item in Model) 
{ 
     <div class="sizeTDCriteria"> 
      @Html.DisplayFor(modelItem => item.Text) 
     </div> 
     <div class="sizeTDCriteriaAction"> 
      @Ajax.ImageActionLink(Url.Content("~/Content/images/icons/edit.png"), "Edit Criteria", "AddOrEditCriteria", "Management", new { competencySectionId = ViewBag.competencySectionId, criteriaId = item.Id }, new AjaxOptions { UpdateTargetId = "AddOrEditCriteriaFormContainer" }, new { @class = "iconPosition" }) 
      @Ajax.ImageActionLink(Url.Content("~/Content/images/icons/delete.png"), "Delete Criteria", "RemoveCriteria", "Management", new { criteriaId = item.Id }, new AjaxOptions { UpdateTargetId = "CompetenciesManagementWrapper" }, new { @class = "iconPosition" }) 
     </div> 
} 

ImageActionLinkは内の画像とActionLinkのを作成し、ヘルパーがちょうど、私はこれをやってみたことである。ここ

は私の設定です正常なActionLinkと問題が同様に発生するので、あなたはそれを無視することができます。また、ImageActionLink全体を、 <img>で、jQueryトリガーを変更せずに変更しようとしました。

ユーザーが編集リンクをクリックすると、 "AddOrEditCriteria"、そのActionResultにajax呼び出しが行われ、条件が見つけられ、PartialViewフォームがdiv "#AddOrEditCriteriaFormContainer"に表示されます。 これまでのところ、すべてのブラウザでうまくいきました。

しかし、編集でもう一度クリックすると、IEはajax呼び出しの代わりに、他のすべてのブラウザが正しくデータを取り込んだときに、PartialViewをキャッシュ内に表示します(これは必須です。そのビューは基準を編集することを可能にし、その間に他の誰かによって編集された可能性があります)。

奇妙な部分はIEが呼び出しを行っているが、何とかそれがサーバーに到達したことがない、それだけであなたは、このネットワークキャプチャから見ることができる結果304を使用して、キャッシュを使用することである:

URL Method Result Type Received Taken Initiator Wait?? Start?? Request?? Response?? Cache read?? Gap?? 
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 304 text/html 182 B < 1 ms JS Library XMLHttpRequest 
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 304 text/html 182 B < 1 ms JS Library XMLHttpRequest 
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 200 text/html 1.53 KB 1.24 s JS Library XMLHttpRequest 

最後1つは最初に起こり、最初の2つは後に行われ、304のリターンを得ています。

ajax呼び出しに「breakcache」パラメータを追加して乱数を付けて修正する方法がありましたが、それは良い解決策のようには見えません。

IEのために更新されるべきでないデータが表示されるため、この問題はユーザーを悩ませています。

答えて

11

IEには、あなたが指示しない限り、AJAX GETがキャッシュされます。

あなたはCache-Controlheader経由で通知しません。

そこでここでは何をすべきかです:

[CacheControl(HttpCacheability.NoCache), HttpGet] 
public ActionResult MyAction() { return Json("Hi!", JsonRequestBehavior.AllowGet); } 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public sealed class CacheControlAttribute : ActionFilterAttribute 
{ 
    public CacheControlAttribute(HttpCacheability cacheability) 
    { 
     this._cacheability = cacheability; 
    } 

    public HttpCacheability Cacheability { get { return this._cacheability; } } 

    private HttpCacheability _cacheability; 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
     cache.SetCacheability(_cacheability); 
    } 
} 
+2

ありがとう!これはうまくいきました。ヘルパーの代わりにjquery.ajaxを使用し、 'cache:false'を使用すると問題が解決しました。しかし、あなたはjqueryを使うために私のすべてのビューを編集する必要はありません。反対側では、jquery.ajaxのようにヘルパーがキャッシュオプションを持つことを期待しています:/ もう一度ありがとう! – LanFeusT

+1

もう一つの選択肢として、私はコントローラーレベルでのコントロールが好きです:http://stackoverflow.com/questions/1160105/asp-net-mvc-disable-browser-cache/5546328#5546328 –

+1

@AdamTuliperこの属性を持つコントローラーをターゲットにすることができます、あまりにも。 –

関連する問題