【发布时间】:2013-02-28 20:33:14
【问题描述】:
我在 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
}
);
【问题讨论】:
-
你在哪里渲染这些路线?你总是从 /Home/Index 冒险吗?
-
我尝试了不同的动作/控制器,在两种情况下总是得到相同的结果。
-
MVC 框架处理路由的方式确实存在“错误”或效率低下。特别是在这种情况下,它试图充分利用所有参数,但会感到困惑。阅读 hacked 的这篇文章,显示系统中有更多“故障”haacked.com/archive/2011/02/20/…
-
我相信 System.Web.Routing 机制在 .NET 4 和 .NET 4.5 中是相同的。该问题与路由和 MVC 3/4 有关。您可以在weblogs.asp.net/imranbaloch/archive/2010/12/26/… 获得详细信息和临时修复。
-
@DaveA 谢谢!您应该将此作为答案发布。
标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing