将两个不同的路由映射到同一个控制器操作

时间:2016-10-26 18:30:53

标签: c# asp.net-core asp.net-web-api-routing

我正在努力扩展示例:https://docs.asp.net/en/latest/tutorials/first-web-api.html

他们有ToDo apis:/api/todo/api/todo/{id}

我想将其扩展到ToDoGroups /api/ToDoGroup

在ToDoGroup下,我希望通过以下方式达到ToDo: /api/ToDoGroup/{id}/ToDo/{id}

如何指向相同的控制器动作?例如,下面的操作也会有另一条路线,例如[HttpGet("ToDoGroup/{ToDoGroupid}/ToDo/{ToDoid}", Name = "GetTodo")]

[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(string id)
{
    var item = TodoItems.Find(id);
    if (item == null)
    {
        return NotFound();
    }
    return new ObjectResult(item);
}

1 个答案:

答案 0 :(得分:1)

首先更改控制器的路由前缀:

      [Route("api/todogroup/{groupId:int}")]
      public class TodoController : Controller 

然后改变你的行动路线:

      [HttpGet("todo/{id}", Name = "GetTodo")]
      public IActionResult GetById(int groupId, string id)

修改 要获得这两条路线,您可以这样做:

        [Route("api")]
      public class TodoController : Controller 

          [HttpGet("todo/{id}", Name = "GetTodo")]//api/todo/43
      public IActionResult GetById(string id)

      [HttpGet("todogroup/{groupdId:int}/todo/{id}", Name = "GetGroupTodo")]//api/todogroup/100/todo/43
      public IActionResult GetById(int groupId, string id)

Asp.Net Web Api有一种方法可以否定路由前缀(在控制器上指定的路由),但是我无法在Asp.Net Core中找到等价物。