2013-08-03 116 views
16

我想一个路由添加到默认的,所以我有两个URL工作:ASP.NET MVC 4路 - 控制器/ ID VS控制器/操作/ ID

  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 } 
); 

然而,第二RO ute不会明显工作。

这将使第二条路线的工作,但将打破第一个:

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

如何两个路由配置结合,从而这两个网址工作? 我很抱歉,如果已经有这样的问题,我没有找到任何东西。

+0

您的第二个网址是否应该包含“书籍”而不是“用户”?您提到第二条路线使第二个网址工作,但打破了第一个网址,但第二个网址不适用于第二条路线,除非它匹配模式“books/{id}”。 – Triynko

回答

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) 
{ 
    // ... 
} 

这样一来,“书”的路线不会赶上像一个网址/users/create(因为第二个参数被要求为一个数字),所以会进入下一个(“默认”)路线。

+0

是的,不,它不会像这样跌倒。当你输入/ users/create时,服务器需要一个{id}而不是“create”,并给出一个“Broken link”错误页面。 –

+0

@ArmanBimatov我的错。我生锈了。我想你也需要在路线上有一个限制。我已经在上面更新了我的答案。 http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs – McGarnagle

+0

不错,它的工作原理。从不知道定义路由的限制。 –