我在 ASP.NET MVC 路由中偶然发现了一个奇怪的行为。
在我的 RouteConfig 文件中,当我映射这样的路由(默认路由)时:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
使用:
@Html.ActionLink("Index", "Home")
我得到一个漂亮、干净且简短的 URL,例如:http://mysite/
但是,如果我在 之后添加另一个可选参数id
,如下所示:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}/{name}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional,
name = UrlParameter.Optional
}
);
同样的ActionLink
输出这个 URL:http://mysite/home/index
每次。我使用 . 验证了相同的行为RedirectToAction
。
我的问题是:有没有办法解决这个问题并在后一种情况下获得更短的 URL?为什么 ASP.NET MVC 路由引擎在这些情况下表现不同?
编辑
我按照 Dave A 发布的说明设法解决了这个问题。我在与我的自定义 URL 模式匹配的“默认”路由之前添加了一个自定义路由。
routes.MapRoute(
name: "Custom",
url: "{controller}/{action}/{id}/{name}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);