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
và
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"eid=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?
bạn có thể hiển thị cho chúng tôi mô hình ProductCategoryType của bạn không? – freshbm
@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
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