Tôi có hai phương pháp hành động mâu thuẫn nhau. Về cơ bản, tôi muốn có thể xem cùng một chế độ bằng hai tuyến khác nhau, hoặc bằng ID của một mục hoặc theo tên của mục và tên của mục đó (các mục có thể có cùng tên trên các phụ huynh khác nhau). Cụm từ tìm kiếm có thể được sử dụng để lọc danh sách.ASP.NET MVC phương pháp hành động mơ hồ
Ví dụ ...
Items/{action}/ParentName/ItemName
Items/{action}/1234-4321-1234-4321
Dưới đây là phương pháp hành động của tôi (cũng có Remove
phương pháp hành động) ...
// Method #1
public ActionResult Assign(string parentName, string itemName) {
// Logic to retrieve item's ID here...
string itemId = ...;
return RedirectToAction("Assign", "Items", new { itemId });
}
// Method #2
public ActionResult Assign(string itemId, string searchTerm, int? page) { ... }
Và đây là các tuyến đường ...
routes.MapRoute("AssignRemove",
"Items/{action}/{itemId}",
new { controller = "Items" }
);
routes.MapRoute("AssignRemovePretty",
"Items/{action}/{parentName}/{itemName}",
new { controller = "Items" }
);
Tôi hiểu tại sao lỗi xảy ra, vì tham số page
có thể là rỗng, nhưng tôi không thể tìm ra cách tốt nhất để giải quyết nó. Thiết kế của tôi có kém để bắt đầu không? Tôi đã nghĩ về việc mở rộng chữ ký của Method #1
để bao gồm các tham số tìm kiếm và di chuyển logic trong Method #2
ra một phương pháp riêng mà cả hai sẽ gọi, nhưng tôi không tin rằng thực sự sẽ giải quyết sự mơ hồ.
Mọi trợ giúp sẽ được đánh giá cao.
Giải pháp thực tế (dựa trên câu trả lời của Levi)
tôi đã thêm các lớp sau đây ...
public class RequireRouteValuesAttribute : ActionMethodSelectorAttribute {
public RequireRouteValuesAttribute(string[] valueNames) {
ValueNames = valueNames;
}
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) {
bool contains = false;
foreach (var value in ValueNames) {
contains = controllerContext.RequestContext.RouteData.Values.ContainsKey(value);
if (!contains) break;
}
return contains;
}
public string[] ValueNames { get; private set; }
}
Và sau đó trang trí các phương pháp hành động ...
[RequireRouteValues(new[] { "parentName", "itemName" })]
public ActionResult Assign(string parentName, string itemName) { ... }
[RequireRouteValues(new[] { "itemId" })]
public ActionResult Assign(string itemId) { ... }
Cảm ơn bạn đã đăng lên triển khai thực tế. Nó chắc chắn sẽ giúp những người có vấn đề tương tự. Như tôi đã có ngày hôm nay. :-P –
Tuyệt vời! Đề xuất thay đổi nhỏ: (imo thực sự hữu ích) 1) params string [] valueNames để làm cho khai báo thuộc tính ngắn gọn hơn và (ưu tiên) 2) thay thế thân phương thức IsValidForRequest bằng 'return ValueNames.All (v => controllerContext.RequestContext.RouteData. Values.ContainsKey (v)); ' –
Xin chào Jon, tôi nghĩ rằng tôi không đảm nhận điều gì đó, bởi vì đâu là các tham số truy vấn trong RouteData? – fravelgue