Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当一个有整数参数,另一个有字符串时,如何处理类似的路由?_C#_Asp.net_Asp.net Mvc_Razor - Fatal编程技术网

C# 当一个有整数参数,另一个有字符串时,如何处理类似的路由?

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

我正在构建一组与管理用户相关的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", 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}”之前,会发生什么情况