0

我在 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
    }
);
4

1 回答 1

3

MVC 框架处理路由的方式确实存在“错误”或效率低下。特别是在这种情况下,它试图充分利用所有参数,但会感到困惑。

阅读 hacked 的这篇文章,显示系统中有更多“故障” http://weblogs.asp.net/imranbaloch/archive/2010/12/26/routing-issue-in-asp-net-mvc-3-rc- 2.aspx

于 2013-03-13T03:12:36.103 回答