C# 当一个有整数参数,另一个有字符串时,如何处理类似的路由?
我正在构建一组与管理用户相关的MVC页面,我在我的C# 当一个有整数参数,另一个有字符串时,如何处理类似的路由?,c#,asp.net,asp.net-mvc,razor,C#,Asp.net,Asp.net Mvc,Razor,我正在构建一组与管理用户相关的MVC页面,我在我的RouteConfig.cs中定义了以下路径: routes.MapRoute(name: "Users", url: "Users", defaults: new { controller = "Users", action = "Index" }); routes.MapRoute(name: "User Details", url: "Users/{id}", defaults: new { controller = "Users", ac
RouteConfig.cs
中定义了以下路径:
routes.MapRoute(name: "Users", url: "Users", defaults: new { controller = "Users", action = "Index" });
routes.MapRoute(name: "User Details", url: "Users/{id}", defaults: new { controller = "Users", action = "Edit", id = UrlParameter.Optional });
routes.MapRoute(name: "User Creation", url: "Users/Create", defaults: new { controller = "Users", action = "Create" });
我面临的问题是,当我导航到/Users/Create
时,会抛出以下错误:
参数字典包含的参数“id”为空
方法的不可为Null的类型“System.Int64”
中的“System.Web.Mvc.ActionResult编辑(Int64)”
“MyUI.Controllers.UsersController”。可选参数必须是
引用类型、可为null的类型或可声明为可选类型
参数参数名称:参数
似乎无法区分为{ID}
传递的数字ID和为帮助路由到正确位置而传递的创建
。这有点道理,因为没有地方提示路由{id}
是一个数字,所以它怎么知道
我的问题最终归结为“如何让MVC路由区分这两种情况,即传入数字id而不是传入字符串以调用控制器中的不同函数?”您需要向路由添加自定义约束:
routes.MapRoute("users Route",
"users/{Id}",
new { controller = "Users", action= "GetUsers" },
new { userId = @"\d+" }
);
这告诉路由引擎,为了让用户的路由被命中,需要有一个全数字的路由段,其中{userId}
路由段是
自定义约束可以是实现
irouteconstain
的任何约束;在本例中,我只是使用一个正则表达式来确定路由约束应该是什么。MapRoute还为约束使用一个参数,对于“Users/{id}”,您可以指定一个约束,它必须是一个整数(正则表达式\d+可能可以)。然后,如果URL为“/Users/Create”,它将跳过该路由,因为“Create”将无法满足约束条件。您可以只切换路由映射的顺序—>“Users”、“Users/Create”、“Users/{id}”。我可能错了,但顺序不起作用吗?如果在RouteConfig.cs中将“Users/Create”放在“Users/{id}”之前,会发生什么情况