ASP.NET Core 2.1路由-CreatedAtRoute-没有路由与提供的值匹配

时间:2018-08-28 17:57:18

标签: c# .net asp.net-core asp.net-core-2.1

我有以下情况

[Route("api/[controller]")]
[ApiController]
public class FooController: ControllerBase
{
    [HttpGet("{id}", Name = "GetFoo")]
    public ActionResult<FooBindModel> Get([FromRoute]Guid id)
    {
        // ...
    }
}

[Route("api/[controller]")]
[ApiController]
public class Foo2Controller: ControllerBase
{

    [HttpPost("/api/Foo2/Create")]
    public ActionResult<GetFooBindModel> Create([FromBody]PostFooBindModel postBindModel)
    {
        //...
        return CreatedAtRoute("GetFoo", new { id = getBindModel.Id }, getBindModel);

    }
}

PS:getBindModel是类型GetFooBindModel的实例。我正在

  

InvalidOperationException:没有路由与提供的值匹配。

我也尝试过更改行

return CreatedAtRoute("GetFoo", new { id = getBindModel.Id }, getBindModel);

return CreatedAtRoute("api/Foo/GetFoo", new { id = getBindModel.Id }, getBindModel);

但仍然是相同的错误。

2 个答案:

答案 0 :(得分:6)

FooController 中将您的操作方法(Get)的名称与HttpGet Attribute上的路由名称进行匹配。您可以在c#中使用nameof关键字:

[HttpGet("{id}", Name = nameof(Get))]
public ActionResult<FooBindModel> Get([FromRoute]Guid id)
{
          ...
}

,也可以使用 nameof 代替硬编码的路由名称:

return CreatedAtRoute(nameof(FooController.Get), new { id = getBindModel.Id }, getBindModel);

,然后重试;

答案 1 :(得分:0)

以下代码对我有用:

return CreatedAtRoute(
          "GetFoo", 
          new { controller = "Foo", id = getBindModel.Id}, 
          getBindModel);