ASP.NET MVC 4路由 - 控制器/ID vs 控制器/操作/ID

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 上已经有类似的问题,请见谅,我没有找到任何相关信息。

你的第二个URL是否应该包含“books”而不是“users”?你提到第二个路线使第二个URL起作用,但破坏了第一个,但除非第二个URL与模式“books/{id}”匹配,否则它不适用于第二个路线。 - Triynko
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 }
);
请确保您“Details”操作中的“id”参数是int类型:
// "users" controller
public ActionResult books(int id)
{
    // ...
}

这样,"Books"路由将不会捕获像/users/create这样的URL(因为第二个参数需要是数字),所以会掉到下一个("Default")路由。


是的,不会像这样掉进去。当您键入 /users/create 时,服务器期望一个 {id} 而不是 "create",并提供一个“损坏的链接”错误页面。 - Arman Bimatov
@ArmanBimatov 对不起,我的错误。我有点生疏了。我想你还需要在路由中添加一个约束条件。我已经更新了上面的答案。http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs - McGarnagle
很好,它可以工作。以前不知道在定义路由时有约束条件。 - Arman Bimatov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接