21

我正在尝试将路由添加到默认路由,以便两个 url 都可以正常工作:

  1. http://www.mywebsite.com/users/create
  2. http://www.mywebsite.com/users/1

这将使第一条路线工作:

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

但是,第二条路线显然行不通。

这将使第二条路线起作用,但会破坏第一条路线:

routes.MapRoute(
     name: "Book",
     url: "books/{id}",
     defaults: new { controller = "users", action = "Details" }
);

如何结合两个路由配置,使两个 URL 都可以工作?如果在 SO 上已经存在这样的问题,我深表歉意,我找不到任何东西。

4

1 回答 1

36

关键是先放更具体的路线。所以把“书”路线放在第一位。 编辑我猜你还需要一个约束,只允许数字匹配这条路线的“id”部分。结束编辑

routes.MapRoute(
    name: "Book",
    url: "books/{id}",
    defaults: new { controller = "users", action = "Details" },
    constraints: new { id = @"\d+" }
);

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

并确保“详细信息”操作中的“id”参数是一个 int:

// "users" controller
public ActionResult books(int id)
{
    // ...
}

这样,“Books”路由将不会捕获类似 URL /users/create(因为第二个参数需要是一个数字),因此将落入下一个(“默认”)路由。

于 2013-08-03T23:43:20.583 回答