【问题标题】:Why nameof doesn't work with the CreationAtAction return statement为什么 nameof 不能与 CreationAtAction return 语句一起使用
【发布时间】:2019-05-21 08:58:16
【问题描述】:

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

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

【问题讨论】:

  • @remario 添加观察者并检查 nameof(GetBook) 返回的内容
  • 如果nameof(GetBook) 没有返回"GetBook",那将是非常令人惊讶的。您的路由问题很可能与 nameof 的使用无关。
  • 您将 CreatedAtAction("GetBook", [...] 与“GetBook”一起使用,但将 nameofCreatedAtRoute 一起使用。两种方法不同。错误很明显,因为您没有使用名称“GetBook”定义任何路由。尝试使用CreatedAtAction(nameof(GetBook), [...]

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


【解决方案1】:

看起来您混淆了CreatedAt*Action*CreatedAt*Route* 方法。 nameof(GetBook) 绝对应该返回 "GetBook"

【讨论】:

    【解决方案2】:

    CreatedAtRoute 是一个继承自 ControllerBase 的辅助方法。 CreatedAtRoute() 所做的是简单地返回一个新的 CreatedAtRouteResult(routeName, routeValues, value) 。根本没有黑魔法:

    /// <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);
    

    CreatedAtRoute 方法经常在 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。

    你也可以看看这个link

    【讨论】:

    • CreatedAtAction(nameof(a), b, c) - 这里 a 是 GET 端点的名称,b 是要传递到该 GET 端点 url 的 ID,c 是创建的对象。我理解对了吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 2023-03-04
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多