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

18

我正在使用ASP.NET Core 2.0.0 Web API尝试构建一个控制器来进行数据库插入。信息可以成功地插入到数据库中,但是返回CreatedAtRoute抛出了一个“InvalidOperationException: No route matches the supplied values.”的错误。到目前为止,我在网上找到的所有内容都说这是ASP.NET Core早期预发布版本的错误,已经得到修复,但我不确定该如何处理。以下是我的控制器代码:

[Produces("application/json")]
[Route("api/page")]
public class PageController : Controller
{
    private IPageDataAccess _pageData; // data access layer

    public PageController(IPageDataAccess pageData)
    {
        _pageData = pageData;
    }

    [HttpGet("{id}", Name = "GetPage")]
    public async Task<IActionResult> Get(int id)
    {
        var result = await _pageData.GetPage(id); // data access call

        if (result == null)
        {
            return NotFound();
        }

        return Ok(result);
    }

    [HttpPost]
    public async Task<IActionResult> Create([FromBody] Page page)
    {
        if (page == null)
        {
            return BadRequest();
        }

        await _pageData.CreatePage(page); // data access call

        // Return HTTP 201 response and add a Location header to response
        // TODO - fix this, currently throws exception 'InvalidOperationException: No route matches the supplied values.'
        return CreatedAtRoute("GetPage", new { PageId = page.PageId }, page);
    }

有人能给我解释一下吗?

1个回答

26

参数需要与预期操作的路由数值相匹配。

在这种情况下,您需要使用id而不是PageId

return CreatedAtRoute(
    actionName: "GetPage", 
    routeValues: new { id = page.PageId },
    value: page);

我遇到了类似的问题,只是我试图在CreatedAtRoute方法中放入路由路径而不是路由名称(并没有给HttpGet方法命名)。好知道。 - MC9000
1
你尝试过添加这个选项吗:services.AddMvc(options => { options.SuppressAsyncSuffixInActionNames = false; });参见:https://dev59.com/m1kS5IYBdhLWcg3wzJL3#63834605 - Sego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接