2012-01-09 38 views
19

Tôi gặp sự cố với Chế độ xem một phần được lưu trong bộ nhớ cache khi không được. Chế độ xem một phần này được sử dụng để hiển thị Logon/Logoff trên một trang. Nó sử dụng mã đơn giản dưới đây để tìm ra những liên kết để hiển thịVô hiệu hóa bộ nhớ đệm trên một chế độ xem một phần trong MVC 3

@if(Request.IsAuthenticated) {  
    <a href="@Url.Action("LogOff", "Account", new { area = "" })">Log Off</a> 
} 
else { 
    <a href="@Url.Action("LogOn", "Account", new { area = "" })">Log On</a> 
} 

phần Xem này được gọi là từ với tất cả các trang trong ứng dụng MVC3 của tôi, sử dụng

@Html.Partial("_HeaderView") 

Trong hầu hết các bộ điều khiển của tôi, tôi có bộ nhớ cache đầu ra được xác định, vì vậy tôi có thể tận dụng bộ nhớ đệm của nội dung của mình.

[OutputCache(Duration = 86400, VaryByParam = "*")] 

Vấn đề của tôi là toàn bộ trang đang được lưu vào bộ nhớ cache khi tôi không muốn xem một phần. Điều này gây ra hành vi sai, trong đó đôi khi hiển thị LogOff ngay cả khi người dùng không đăng nhập, vv Có cách nào để lưu trữ tất cả nội dung, ngoại trừ chế độ xem một phần được đề cập không?

+0

Nick, xin lỗi đã phải thêm nhận xét tại đây. Nhưng dù sao, nó hoạt động khi tôi gỡ bỏ Nostore và thay đổi thời gian thành 1. Vấn đề duy nhất là khi người dùng đăng nhập, họ được đưa đến trang chủ nhưng tôi phải làm mới nó một cách rõ ràng để thay đổi có hiệu lực (hiển thị đăng xuất thay vì đăng nhập). – SimpleUser

Trả lời

9

gì bạn đang tìm kiếm được gọi là Donut Caching. Dưới đây là một bài viết tuyệt vời giải thích nó là gì và cách làm cho nó hoạt động http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3

+0

Tôi đã thử cái này, nhưng nó không làm việc cho tôi như mong đợi. Tôi vẫn còn có các vấn đề tương tự như sử dụng thuộc tính outputcache trên một phần hành động, cụ thể là làm mới trang chủ bằng tay. – SimpleUser

+0

Tôi rất muốn giúp đỡ, nhưng không nhìn thấy mã bạn đã có được đó là khó khăn :) Nó làm việc cho tôi mặc dù. Khi bạn kiểm tra, hãy nhớ về cài đặt trình duyệt thích hợp (đôi khi chúng ghi đè cài đặt máy chủ và trường hợp hiển thị sai một điều gì đó không hoạt động) – torm

+0

Không, chỉ là tôi có một khoảnh khắc rất chậm. Làm việc với bệnh cúm rõ ràng không phải là một ý kiến ​​hay. Nhưng điều này hoạt động ngay bây giờ. Cảm ơn sự giúp đỡ của bạn – SimpleUser

18

Bạn có thể vô hiệu hóa bộ nhớ đệm bằng cách trang trí bộ điều khiển hiển thị _HeaderView bạn một phần như sau:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult HeaderView() 
{ 
    return PartialView("_HeaderView"); 
} 
+0

Xin chào Nick. Cảm ơn vì đầu vào của bạn. Nhưng tôi không có một hành động điều khiển kết hợp với một phần xem (cho bây giờ anyway). Tôi đang gọi nó bằng cách sử dụng Html.Partial(). Cách duy nhất để có một hành động điều khiển với những điều trên? – SimpleUser

+0

Có thể bạn có thể thêm một bộ điều khiển dùng chung và thêm một hành động HeaderView trả về PartialView ("_ HeaderView"); và được trang trí bằng chú thích trong câu trả lời của tôi ở trên. Hy vọng rằng điều này sẽ cung cấp cho bạn sự kiểm soát bạn cần và không phải là một thay đổi lớn. Hãy cho tôi biết nếu điều đó phù hợp với bạn hoặc bạn cần làm rõ thêm. – Nick

+0

Cảm ơn Nick.Tôi sẽ thực hiện các thay đổi và cho bạn biết nó sẽ như thế nào. – SimpleUser

3

Chúng ta nên đặt cấu hình bộ nhớ cache trong tệp Web.config thay vì đặt giá trị bộ nhớ cache riêng lẻ trong các trang để tránh mã dư thừa. Chúng ta có thể tham khảo profile bằng cách sử dụng thuộc tính CacheProfile của thuộc tính OutputCache. Hồ sơ bộ nhớ cache này sẽ được áp dụng cho tất cả các trang trừ khi trang/phương pháp ghi đè các cài đặt này.

<system.web> 
    <caching> 
    <outputCacheSettings> 
     <outputCacheProfiles> 
     <add name="CacheProfile" duration="60" varyByParam="*" /> 
     </outputCacheProfiles> 
    </outputCacheSettings> 
    </caching> 
</system.web> 

Và nếu bạn muốn vô hiệu hóa bộ nhớ đệm từ hành động của bạn mà trả về xem phần [_HeaderView], bạn có thể ghi đè lên các thiết lập cấu hình bộ nhớ cache của trang trí rằng phương pháp hành động cụ thể như hình dưới đây:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult RenderPartialView() 
{ 
    return PartialView("_HeaderView"); 
} 

Hy vọng điều này sẽ giúp bạn!

1

làm việc này cho tôi ..

public ActionResult LogOff() 
{ 
    AuthenticationManager.SignOut(); 
    var url = Url.Action("Index", "Web"); 
    HttpResponse.RemoveOutputCacheItem(url);   
    return RedirectToAction("Index", "Web"); 
} 
+0

+1 Tôi đã thử tất cả các giải pháp khác, chúng không hoạt động tốt, điều này làm việc như một sự quyến rũ đối với tôi ... Cảm ơn :) Lưu ý: Tôi không phải sử dụng AuthenticationManager.Signout() .; –

0

Took một chút thời gian để tìm một này ra sau khi trở lại vào MVC. Chỉ cần đặt cài đặt Bộ nhớ cache trực tiếp trong Chế độ xem Tiêu đề Một phần. Như trong khi hiển thị tên người dùng. Không cần mã toàn cầu hoặc mã phía máy chủ. Chỉ có vấn đề là một khi một trang được lưu trữ, nó sẽ không làm mới ngay lập tức sau khi đăng nhập. Nhưng chúng tôi giữ tốc độ khi cần thiết trong quá trình duyệt ban đầu cho sản phẩm. Ok thương mại trong trường hợp của chúng tôi.

 

    @if (Request.IsAuthenticated) 
    { 
      @* when we are authenticated, don't cache any more! *@ 
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    HttpContext.Current.Response.Cache.SetNoStore(); 
    HttpContext.Current.Response.Cache.SetNoServerCaching(); 
      @*@Html.Raw(DateTime.Now.ToString())*@ 
    @Html.ActionLink("Welcome " + (String.IsNullOrEmpty(((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")) ? User.Identity.Name : ((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")), "Index", "Manage", routeValues: new { Area = "Store" }, htmlAttributes: new { title = "Manage"}) 
    } 
    else 
    { 
    } 

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