Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 路由到具有不同参数的相同url的不同操作_C#_Asp.net Core_Asp.net Core Routing - Fatal编程技术网

C# 路由到具有不同参数的相同url的不同操作

C# 路由到具有不同参数的相同url的不同操作,c#,asp.net-core,asp.net-core-routing,C#,Asp.net Core,Asp.net Core Routing,我正在使用以下路线构建api: /items和/items/{id}。 现在,我想将此路由路由到两个不同的操作。我无法使用属性对其进行配置,以下是配置: routes.MapRoute( "route1", "/items", new { controller = "Items", action = "Get" }); routes.MapRoute( "route2", "/items/{id}", new { controller =

我正在使用以下路线构建api:
/items
/items/{id}
。 现在,我想将此路由路由到两个不同的操作。我无法使用属性对其进行配置,以下是配置:

routes.MapRoute(
    "route1", 
    "/items", 
    new { controller = "Items", action = "Get" });

routes.MapRoute(
    "route2", 
    "/items/{id}", 
    new { controller = "Items", action = "Get" });

但这条路线根本不起作用。我错在哪里?

不可能有两个同名的操作方法,并使用路由模板将它们映射,除非这些方法映射到不同的HTTP方法(所有这些都是由于模型绑定的工作方式):

但是,使用属性路由是可以做到这一点的。如果无法使用此方法,则只有以下选项:

  • 重命名某个操作的名称
  • 使用可选的
    id
    参数将两个操作合并为一个
并将路由定义为

routes.MapRoute(
    name: "route",
    template: "{controller=Items}/{action=Get}/{id?}");

将第二个操作更改为调用
GetByID
,并在路由中将其重命名为match。感谢您的建议。这是最简单的解决方案。你知道其他的方法吗?为什么你不能用属性来配置它?FWIW,你所拥有的应该可以很好地工作,除了两个路由都被用于相同的操作,这是你明确说你不想要的。实际问题是什么?@IvanRubanau展示了一个你试图映射到的两个不同动作的例子
    public class ItemsController : Controller
    {
        public IActionResult Get(int? id) 
        { 
            if (id.HasValue())
            { // logic as in second action }
            else
            { // first action logic }
        }
    }
routes.MapRoute(
    name: "route",
    template: "{controller=Items}/{action=Get}/{id?}");