2

我正在努力实现我的应用程序路由更改为如下所示的目标:

hxxp://host/MyController/Widgets/3/AddWhatsit

此路线的视图将帮助用户将 Whatsit 添加到 Widget 3。

同样,我希望创建新 Widget 的路线是:

hxxp://host/MyController/Widgets/Create

我已经创建了单独的路线来尝试和促进这一点。他们是:

           routes.MapRoute("DefaultAction",
                            "{controller}/{action}",
                            new {controller = "Home", action = "Index"});

           routes.MapRoute("Default",
                            "{controller}/{id}/{action}",
                            new {controller = "Home", action = "Index", id = UrlParameter.Optional});

我遇到的问题是,当我浏览到小部件的索引页面(/MyController/Widgets,匹配“DefaultAction”路由)时,任何会引入不属于该路由的新 url 参数的 ActionLinks 都会变成查询字符串价值。因此,例如,Widget 3 的编辑链接将呈现为: Widget/Edit?id=3 instead of (what I would prefer): Widget/3/Edit

我想我知道我没有把我的(可选)id 参数放在路线的末尾,这把事情搞砸了。

我应该把它吸起来,然后在路线的尽头留下 id 吗?

4

2 回答 2

2

有可能实现这一点。要获得看起来像 /Home/1/Index 的锚链接,请设置如下路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Custom",
        url: "{controller}/{id}/{action}"
        );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

然后,在视图中:

@Html.ActionLink("Here", "Index", "Home", new { id = 5 }, null)

你会得到这样的链接:

<a href="/Home/5/Index">Here</a>

怪癖是限制自定义路线。在这种情况下,我删除了默认值,它们没有意义。当然还有路线的顺序。

于 2013-03-21T20:41:51.717 回答
1

我相信您需要更改路线的顺序。请记住,MVC 查看路由列表并选择第一个匹配的路由。带有 ID 参数的第二条路由更具体,因此应该在路由表中排在第一位。

即使您在 ActionLink 中指定了 ID 参数,您也指定了控制器和操作。因此,第一个路由是由 RoutingEngine 选择的。

最后,删除 ID 属性的可选参数。由于您希望在拥有 Id 时选择该路由,因此您不希望它成为可选参数,您希望它必须与该路由匹配。

routes.MapRoute("Default","{controller}/{id}/{action}", 
   new {controller = "Home", action = "Index"});

routes.MapRoute("DefaultAction", "{controller}/{action}", 
  new {controller = "Home", action = "Index"});
于 2013-03-21T20:42:02.190 回答