为什么nameof不能与CreationAtAction返回语句一起使用

时间:2019-05-21 08:58:16

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

我正在使用 .NET Core 开发Web API,当我向Web API发送帖子或更新时,我正在返回资源。为此,在每种方法的最后,我使用的是CreatedAtAction方法,其中第一个参数是动作名称。

例如,当我使用硬编码的动作名称CreatedAtAction("GetBook", [...]时,它可以工作。但是,当我使用CreatedAtRoute(nameof(GetBook), [...]时,出现一条错误消息,指出没有路由匹配。有什么特别的原因吗?

3 个答案:

答案 0 :(得分:1)

好像您混合使用了CreatedAt*Action*CreatedAt*Route*方法。 nameof(GetBook)肯定会返回"GetBook"

答案 1 :(得分:0)

请参考以下链接:https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-2.2 它显示 CreatedAtAction ((nameof(GetBook),[...]))应该起作用。

答案 2 :(得分:0)

CreateAtRoute是一个帮助方法,继承自ControllerBase CreateAtRoute()的作用是简单地返回一个新的CreatedAtRouteResult(routeName,routeValues,值)。根本没有黑魔法:

/// <summary>
/// Creates a <see cref="CreatedAtRouteResult"/> object that produces a <see cref="StatusCodes.Status201Created"/> response.
/// </summary>
/// <param name="routeName">The name of the route to use for generating the URL.</param>
/// <param name="routeValues">The route data to use for generating the URL.</param>
/// <param name="value">The content value to format in the entity body.</param>
/// <returns>The created <see cref="CreatedAtRouteResult"/> for the response.</returns>
[NonAction]
public virtual CreatedAtRouteResult CreatedAtRoute(string routeName, object routeValues, object value)
=> new CreatedAtRouteResult(routeName, routeValues, value);

CreateAtRoute方法通常在ApiController中使用,第三个参数将用作response的内容。假设一个动作方法:

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

    [HttpGet("{id}", Name = "HelloDetails")]
    public IActionResult GetDetail(int id)
    {
        var result = new MyItem() {
            Id=id,
            ItemName="sherry"
        }; 

        return new JsonResult(result);
    }

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

        return CreatedAtRoute("HelloDetails", new { id = item.Id }, item);
    }

使用Postman进行测试,结果为201。响应的正文包含我们创建的实体的详细信息,响应的Location标头包含指向该实体的URI。

enter image description here

enter image description here

您也可以看看此link