2012-01-13 28 views
5

Tôi có một công cụ hoạt động hoàn toàn tốt trong Chrome và FF. Nhưng với bất kỳ phiên bản nào của IE, trình duyệt sẽ hiển thị thông tin bộ nhớ cache khi thực hiện thao tác kéo Ajax để truy xuất dữ liệu.Internet Explorer hiển thị dữ liệu bộ nhớ cache qua Ajax Pull với 304 Kết quả

Đây là thiết lập của tôi:

Tôi có tiêu chí mà tôi lặp qua:

@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> 
} 

Các ImageActionLink chỉ là một helper tạo ra một ActionLink với một hình ảnh bên trong, tôi đã cố gắng làm điều này với một ActionLink bình thường và vấn đề xảy ra là tốt, do đó bạn có thể bỏ qua điều đó. Tôi cũng đã cố gắng để thay đổi toàn bộ ImageActionLink bởi một đồng bằng <img> với một kích hoạt jQuery không có sự khác biệt. Điều này xảy ra là khi người dùng nhấp vào liên kết Chỉnh sửa, nó sẽ thực hiện cuộc gọi ajax đến "AddOrEditCriteria", ActionResult đó, tìm tiêu chí và hiển thị biểu mẫu PartialView trở lại div "#AddOrEditCriteriaFormContainer". Cho đến nay rất tốt, điều này hoạt động tốt trong tất cả các trình duyệt.

Nhưng khi tôi nhấp lần thứ hai vào bản chỉnh sửa đó, thay vì thực hiện cuộc gọi ajax, IE chỉ hiển thị PartialView từ bộ nhớ trong bộ nhớ cache, khi tất cả các trình duyệt khác lại lấy dữ liệu một cách chính xác. chế độ xem đó cho phép chỉnh sửa các tiêu chí, nó có thể đã được chỉnh sửa bởi người khác trong thời gian đó).

Phần lạ là IE đang thực hiện cuộc gọi nhưng bằng cách nào đó nó không bao giờ đạt đến máy chủ, nó chỉ sử dụng bộ nhớ cache bằng cách sử dụng một quả 304. Bạn có thể nhìn thấy từ capture của Network này:

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 

cuối cùng một là lần đầu tiên xảy ra, hai cái đầu tiên được thực hiện sau và thu được lợi nhuận 304.

Tôi tìm thấy cách sửa lỗi bằng cách thêm tham số "breakcache" vào cuộc gọi ajax với số ngẫu nhiên, nhưng điều đó dường như không phải là giải pháp tốt.

Sự cố này đã gây khó khăn cho người dùng của chúng tôi vì họ thấy dữ liệu không được cập nhật tất cả vì IE.

Trả lời

11

IE sẽ lưu trữ AJAX GET s trừ khi bạn không yêu cầu.

Bạn không được thông báo qua số Cache-Controlheader.

Vì vậy, đây là những gì chúng tôi làm:

[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

Cảm ơn! Điều đó làm việc, tôi cũng thấy rằng việc sử dụng jquery.ajax thay vì helper và sử dụng 'cache: false' giải quyết vấn đề. Nhưng của bạn sẽ cho phép tôi không phải chỉnh sửa tất cả các quan điểm của tôi để sử dụng jquery. Ở phía bên kia, tôi mong đợi người trợ giúp có tùy chọn bộ nhớ cache giống như jquery.ajax:/ Cảm ơn bạn lần nữa! – LanFeusT

+1

là một giải pháp thay thế khác, tôi thích kiểm soát ở cấp bộ điều khiển: http://stackoverflow.com/questions/1160105/asp-net-mvc-disable-browser-cache/5546328#5546328 –

+1

@AdamTuliper Bạn có thể nhắm mục tiêu các bộ điều khiển với thuộc tính này , quá. –

Các vấn đề liên quan