2015-05-12 14 views
6

Tôi đang sử dụng OutputCache trong MVC 5 để Cache chế độ xem trên máy chủ.OutputCache VaryByParam thay đổi theo tham số không được phép bao gồm

Tôi chỉ muốn lưu vào bộ đệm chế độ xem dựa trên hai tham số trong chuỗi truy vấn.

Phương pháp hành động

[HttpGet] 
[OutputCache(Location = OutputCacheLocation.Server, Duration = 60*10, VaryByParam = "id;quoteid")] 
public ActionResult MyAction(int id, ProductCategoryType category) 
{ 
    return Content(DateTime.Now.ToString()); 
} 

Route

context.MapRoute(
"MyCustomRoute", 
"myarea/{controller}/{action}/{id}/{category}/{name}/{quoteId}", 
new { controller = "MyController", name = UrlParameter.Optional, quoteId = UrlParameter.Optional }, 
new[] { "MyNamespace.Areas.MyArea.Controllers" }); 

URL

http://localhost:17191/myarea/mycontroller/myaction/2/1/a-holiday/aquoteid 

này hoạt động và liên kết các dữ liệu một cách chính xác Tuy nhiên, nếu tôi thay đổi bất kỳ phần nào của {name} một phần của URL, nó vẫn tạo ra một mục bộ nhớ cache mới, mặc dù trong phương pháp hành động của tôi, tôi đã speficied VaryByParam="id;quoteid"

Ví dụ ...

http://localhost:17191/myarea/mycontroller/myaction/2/1/a-holiday/somequoteid 

http://localhost:17191/myarea/mycontroller/myaction/2/1/another-holiday/somequoteid 

... đang tạo ra DateTime khác nhau - nhưng họ không nên - họ cần phải giống hệt nhau.

Tôi đã làm gì sai và làm cách nào để đạt được hành vi mong muốn?


Sửa

Chỉ cần được rõ ràng, ProductCategoryType là một Enum đang được ràng buộc qua nó int giá trị. Các ràng buộc cho điều này là đúng khi tôi gỡ lỗi ActionResult

Chỉnh sửa 2 Kể từ khi tôi đã được yêu cầu để hiển thị ProductCategoryType, tôi đã thêm nó dưới đây. Điều này không ràng buộc chính xác khi tôi gỡ lỗi mặc dù - Tôi không nghĩ rằng nó có bất cứ điều gì để làm với vấn đề.

public enum ProductCategoryType 
{ 
    TourActivity = 1, 
    Accommodation = 2, 
    BusPass = 3, 
    SelfDrive = 4, 
} 

Sửa 3

Thay đổi URL để: http://localhost:17191/a/products/view/2/1?name=test1&quoteid=123

Và bộ nhớ cache hiện đang làm việc như mong đợi - nhưng làm thế nào tôi có thể đạt được điều này với URL đẹp hơn thông qua định tuyến?

+0

bạn có thể hiển thị cho chúng tôi mô hình ProductCategoryType của bạn không? – freshbm

+0

@freshbm Nó không phải là một mô hình - đó là một enum. Tuy nhiên, tôi sẽ thêm nó vào câu hỏi. – Alex

+0

vì vậy bạn liên kết quoteId của bạn trong hành động của bạn, bạn phải ràng buộc nó nếu bạn không sử dụng nó như param trong VaryByParam – freshbm

Trả lời

2

Cơ chế sử dụng VaryByParam hoạt động cụ thể trên chuỗi truy vấn hoặc thông số bài của yêu cầu HTTP thô thực tế và không nhận thức được bất kỳ định tuyến URL nào ánh xạ yêu cầu thô đó lên một số biểu mẫu khác. Vì vậy, trong trường hợp của bạn, nó sẽ không thấy các tham số id hoặc quoteid ở tất cả (vì chúng không thực sự trong chuỗi truy vấn hoặc bài đăng của yêu cầu thô).

Tuy nhiên, sẽ nhận thấy rằng chính URL đó (trước bất kỳ '?', Bao gồm tên) khác nhau và thay đổi bộ nhớ đệm trên đó.

Bạn có thể cần cân nhắc sử dụng VaryByCustom để thay thế. Xem here để biết ví dụ. Và có một ví dụ SO-câu hỏi rất giống nhau here.

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