Sử dụng bộ định vị phương pháp nằm ngoài ASP.NET MVC (3 hoặc 4DP), có cách nào để khung MVC phân biệt giữa chuỗi và hướng dẫn mà không cần phân tích tham số trong hành động điều khiển?Phân biệt các tham số chuỗi và hướng dẫn trong MVC 3
Định nghĩa trên sẽ cho URL
http://[domain]/customer/details/F325A917-04F4-4562-B104-AF193C41FA78
để thực hiện phương pháp
public ActionResult Details(Guid guid)
, và
để thực hiện
public ActionResult Details(string id)
phương pháp.
Với không có thay đổi, rõ ràng là các phương pháp là mơ hồ, như sau:
public ActionResult Details(Guid id)
{
var model = Context.GetData(id);
return View(model);
}
public ActionResult Details(string id)
{
var model = Context.GetData(id);
return View(model);
}
dẫn đến lỗi:
The current request for action 'Details' on controller type 'DataController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Details(System.Guid) on type Example.Web.Controllers.DataController
System.Web.Mvc.ActionResult Details(System.String) on type Example.Web.Controllers.DataController
tôi cố gắng sử dụng một hạn chế tùy chỉnh (dựa trên How can I create a route constraint of type System.Guid?) để thử và đẩy thông qua định tuyến:
routes.MapRoute(
"Guid",
"{controller}/{action}/{guid}",
new { controller = "Home", action = "Index" },
new { guid = new GuidConstraint() }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Và chuyển chữ ký hành động để:
public ActionResult Details(Guid guid)
{
var model = Context.GetData(guid);
return View(model);
}
public ActionResult Details(string id)
{
var model = Context.GetData(id);
return View(model);
}
Ràng buộc thực hiện và vượt qua, do đó lập luận được gửi đến một hành động, nhưng dường như vẫn còn là một chuỗi, và do đó không rõ ràng với hai chữ ký phương pháp. Tôi hy vọng rằng có một cái gì đó trong cách các phương pháp hành động được đặt mà gây ra sự mơ hồ, và do đó có thể được ghi đè bằng cách cắm vào một mô-đun tùy chỉnh để xác định vị trí phương pháp. Kết quả tương tự có thể đạt được bằng cách phân tích cú pháp tham số chuỗi, nhưng sẽ rất tốt nếu ngắn gọn để tránh logic đó trong hành động (chưa kể đến hy vọng tái sử dụng một ngày nào đó sau này).
bạn nói đúng, phương pháp hành động định vị là không biết gì về các hạn chế đường. Nếu bạn loại bỏ phương thức hành động chuỗi, phương thức hành động guid có được chọn không? – bzlm
MVC không hỗ trợ quá tải phương thức chỉ dựa trên chữ ký - giải pháp đơn giản nhất có thể đơn giản là có hai phương thức hành động được đặt tên duy nhất, một chi tiết của GUID (Chi tiết) và khác. ?). – Tommy
@bzlm - Đúng, loại bỏ chuỗi hành động sẽ chọn Hướng dẫn (giả sử nó vượt qua ràng buộc HOẶC có thể được phân tích cú pháp thành một Hướng dẫn). – falquan