我刚刚遇到这个问题,尽管它现在已经很老了,但它仍然非常相关。具有讽刺意味的是,该线程中的一个正确评论是由一位自认是 MVC 初学者在撰写帖子时发布的。甚至 ASP.NET 文档也不完全正确。我有一个大项目,我成功地重载了动作方法。
如果您了解路由,除了简单的 {controller}/{action}/{id} 默认路由模式之外,很明显可以使用任何唯一模式映射控制器操作。这里有人谈到多态,说:“HTTP 不懂多态”,但是路由和 HTTP 没有关系。简单来说,就是一种字符串模式匹配的机制。
完成这项工作的最佳方法是使用路由属性,例如:
[RoutePrefix("cars/{country:length(3)}")]
public class CarHireController
{
[Route("{location}/{page:int=1}", Name = "CarHireLocation")]
public ActionResult Index(string country, string location, int page)
{
return Index(country, location, null, page);
}
[Route("{location}/{subLocation}/{page:int=1}", Name = "CarHireSubLocation")]
public ActionResult Index(string country, string location, string subLocation, int page)
{
//The main work goes here
}
}
这些操作将处理像/cars/usa/new-york 和/cars/usa/texas/dallas 这样的网址,它们将分别映射到第一个和第二个索引操作。
检查这个示例控制器很明显,它超出了上面提到的默认路由模式。如果您的 url 结构与您的代码命名约定完全匹配,则默认设置效果很好,但情况并非总是如此。代码应该对域进行描述,但 url 通常需要更进一步,因为它们的内容应该基于其他标准,例如 SEO 要求。
默认路由模式的好处是它会自动创建唯一的路由。这是由编译器强制执行的,因为 url 将匹配唯一的控制器类型和成员。滚动您自己的路线模式需要仔细考虑以确保其唯一性并且它们有效。
重要说明 一个缺点是,使用路由为重载操作生成 url 在基于操作名称时不起作用,例如,在使用 UrlHelper.Action 时。但如果使用命名路由,例如 UrlHelper.RouteUrl,它确实有效。并且,根据备受尊敬的消息来源,使用命名路由是无论如何都要走的路 (http://haacked.com/archive/2010/11/21/named-routes-to-the-rescue.aspx/)。
祝你好运!