C# 如何在.NET核心Mvc中处理两个路由和直接到一个操作

C# 如何在.NET核心Mvc中处理两个路由和直接到一个操作,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,这是我在Startup.cs中的路线规则 routes.MapRoute( name: "UnsolvedTagspecial", template: "user/undo/{t}", defaults: new { Controller = "user", action = "undo" } ); routes.MapRoute(

这是我在Startup.cs中的路线规则

routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
以下是我在控制器中的操作:

//Controller:
public async Task<ActionResult> undo(string t)
{
    //   .....
}
//控制器:
公共异步任务撤消(字符串t)
{
//   .....
}
  • 当我输入
    http://localhost:17623/user/undo/111
    在地址行中,我在控制器函数中得到t的值为null
  • 但是当我输入
    http://localhost:17623/user/111/undo
    在地址行中,我得到控制器函数中的t=111

这让我很困惑,谁能告诉我原因呢?

这是因为您必须设置从最特定到最通用的路由。我想你的路线会是这样的

 routes.MapRoute(
                   name: "default",
                   template: "{controller=Home}/{action=Index}/{id?}");

routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
routes.MapRoute(
                   name: "default",
                   template: "{controller=Home}/{action=Index}/{id?}");
因此,当您输入
http://localhost:17623/user/undo/111
它命中第一条路径,该路径期望111为
id
,但当它转到
action
时,参数期望
字符串t
。所以你应该这样布置路线

 routes.MapRoute(
                   name: "default",
                   template: "{controller=Home}/{action=Index}/{id?}");

routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
routes.MapRoute(
                   name: "default",
                   template: "{controller=Home}/{action=Index}/{id?}");

从most专用到most通用这是因为您必须设置从most专用到most通用的路由。我想你的路线会是这样的

 routes.MapRoute(
                   name: "default",
                   template: "{controller=Home}/{action=Index}/{id?}");

routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
routes.MapRoute(
                   name: "default",
                   template: "{controller=Home}/{action=Index}/{id?}");
因此,当您输入
http://localhost:17623/user/undo/111
它命中第一条路径,该路径期望111为
id
,但当它转到
action
时,参数期望
字符串t
。所以你应该这样布置路线

 routes.MapRoute(
                   name: "default",
                   template: "{controller=Home}/{action=Index}/{id?}");

routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
routes.MapRoute(
                    name: "UnsolvedTagspecial",
                    template: "user/undo/{t}",
                    defaults: new { Controller = "user", action = "undo" }
                    );

routes.MapRoute(
                    name: "UnsolvedTag",
                    template: "user/{t}/undo",
                    defaults: new { Controller = "user", action = "undo" }
                    );
routes.MapRoute(
                   name: "default",
                   template: "{controller=Home}/{action=Index}/{id?}");

从大多数特定的到大多数通用的

最有可能的是,在
“user/undo/{t}”
之前有一条与模式匹配的路径。显示其余的路由(包括属性路由)。我有一个默认路由@Usman。正如他所说,我解决了这个问题。最有可能的是,在
“user/undo/{t}”
之前有一条与模式匹配的路径。显示其余的路由(包括属性路由)。我有一个默认路由@Usman。我按照他说的解决了问题我的地图路线顺序和你说的一样,我还有一个问题:我的链接是这样的:
http://localhost:17623/user/undo/111
my
controller=user'和my
action=undo`为什么重定向到此规则
routes.MapRoute(名称:“默认”,模板:“{controller=Home}/{action=Index}/{id?}”)
我的MapRoute顺序和你说的一样,cry.我还有一个问题:我的链接是这样的:
http://localhost:17623/user/undo/111
my
controller=user'和my
action=undo`为什么重定向到此规则
routes.MapRoute(名称:“默认”,模板:{controller=Home}/{action=Index}/{id?}”);