2010-06-03 4 views
6

Tôi đang gặp sự cố với bộ đệm ẩn của IE kết quả của một phương thức hành động.Làm cách nào để dừng lưu trữ MVC các kết quả của việc gọi một phương thức hành động?

Các bài viết khác tôi tìm thấy có liên quan đến bảo mật và thuộc tính [Ủy quyền]. Vấn đề này không liên quan gì đến an ninh.

Đây là phương pháp "ghi lại phiếu bầu, lấy trung bình, trả lại trung bình và số phiếu bầu" rất đơn giản. Điều thú vị duy nhất về nó là nó được gọi thông qua Ajax và trả về một đối tượng Json. Tôi tin rằng đó là đối tượng Json đang được lưu trữ.

Khi tôi chạy nó từ FireFox và xem lưu lượng truy cập XHR bằng Firebug, mọi thứ hoạt động hoàn hảo. Tuy nhiên, theo IE 8, đồ họa "throbber" không bao giờ có thời gian để hiển thị và các phần tử trang hiển thị "avg" mới và số đếm đang được đưa vào trang với jQuery không bao giờ khác nhau.

Tôi cần một cách để yêu cầu MVC không bao giờ lưu bộ nhớ cache phương thức hành động này.

Bài viết này dường như để giải quyết vấn đề này, nhưng tôi không thể hiểu được nó: Prevent Caching of Attributes in ASP.NET MVC, force Attribute Execution every time an Action is Executed

Tôi cần bối cảnh nhiều hơn một chút cho các giải pháp để hiểu làm thế nào để mở rộng AuthorizationAttribute. Vui lòng giải đáp câu trả lời của bạn như thể bạn đang nói chuyện với một người thiếu hiểu biết sâu sắc về MVC ngay cả khi điều đó có nghĩa là trả lời bằng một bài viết về một số điều cơ bản/điều kiện tiên quyết được yêu cầu.

Cảm ơn,

Trey Carroll

Trả lời

21

MVC không cache kết quả. IE không.

Vì vậy, bạn phải yêu cầu IE không làm điều đó.

Đây là cách tôi thực hiện. Thứ nhất, một thuộc tính:

[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); 
    } 
} 

Tiếp theo, một hành động:

[CacheControl(HttpCacheability.NoCache), HttpGet] 
    public JsonResult MyAction() 
+0

Cảm ơn bạn Craig. Đây chính xác là những gì tôi cần. Tuy nhiên, tôi vừa thêm lớp vào Root Level của dự án MVC, điều mà tôi chắc chắn là không chính xác. Điều gì sẽ là vị trí chính xác cho lớp này trong một giải pháp MVC 2? –

+0

Tùy thuộc vào bạn. Đây là, có hiệu quả, khuôn khổ mã. Bạn có thể đặt nó trong một thư viện lớp riêng biệt hoặc một không gian tên "Mvc" trong ứng dụng web của bạn. –

+3

Điều này đơn giản hơn nhiều trong MVC ngay bây giờ, chỉ cần sử dụng OutputCache và đặt thời lượng thành 0 giây: [OutputCache (Duration = 0)] Public ActionResult Cities (int provinceId) { var myData = SomeClassInstance.SomeMethod(); trả về Json (myData, JsonRequestBehavior.AllowGet); } –