ASP.NET MVC 4路由 - 控制器/ id与控制器/动作/ id

时间:2013-08-03 23:26:46

标签: asp.net-mvc asp.net-mvc-4 routes asp.net-mvc-routing

我正在尝试将路由添加到默认路由,以便我有两个URL工作:

  1. http://www.mywebsite.com/users/create
  2. http://www.mywebsite.com/users/1
  3. 这将使第一条路线起作用:

    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上已经存在这样的问题我很抱歉,我无法找到任何东西。

1 个答案:

答案 0 :(得分:34)

关键是首先提出更具体的路线。所以首先把“预订”路线。 编辑我猜你还需要一个约束,只允许数字匹配此路线的“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”路由将不会捕获像/users/create这样的URL(因为第二个参数被重新命名为一个数字),因此将落到下一个(“Default”)路由。