.net 具有带可选参数的索引操作的控制器

.net 具有带可选参数的索引操作的控制器,.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-routing,.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc Routing,我希望为“用户”控制器提供一个索引操作,该控制器采用可选参数 /Users/{id} 或 我想避免: /Users/Index/{id} 或 我在索引操作中添加了映射/Users/{id}的路由 routes.MapRoute( "Users", "Users/{id}", new { controller = "Users", action = "Index", id = UrlParam

我希望为“用户”控制器提供一个索引操作,该控制器采用可选参数

/Users/{id}

我想避免:

/Users/Index/{id}

我在索引操作中添加了映射/Users/{id}的路由

routes.MapRoute( "Users",
                 "Users/{id}",
                 new { controller = "Users", action = "Index", id =
                 UrlParameter.Optional});
那很好。当我向Users控制器添加另一个操作“Add”时,遇到了一个问题,该操作也带有一个可选参数。我先前添加的路由曲解作为索引操作的参数添加。为/Users/Add触发“索引”操作

我怎样才能两者兼得呢


谢谢。

您无需为控制器上的每个操作创建路由。在项目创建之初,global.asax中的默认路由足以满足您的需要:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Account", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
将“约束”属性设置为仅允许数字。这将解决您的路由问题

routes.MapRoute( "Users",
    "Users/{id}",
    new { controller = "Users", action = "Index", id = UrlParameter.Optional },
    new { id = "[0-9]+" }
);
编辑

您可以在不使用正则表达式约束的情况下进行不同的操作。添加路由用户/Add显式,将其添加到索引路由之前:


我创建路由是为了避免/Users/Index/{id}。@JoelSkrepnek我确实没有。请看我的编辑。你总是可以像这样“硬连线”路线;关键是把更具体的放在第一位。谢谢。我会和老板商量的:)。
routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Account", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute( "Users",
    "Users/{id}",
    new { controller = "Users", action = "Index", id = UrlParameter.Optional },
    new { id = "[0-9]+" }
);
routes.MapRoute( "Users",
    "Users/Add/{id}",
    new { controller = "Users", action = "Add", id = UrlParameter.Optional }
);