首页 > 解决方案 > FromRoute 不在单独的 DTO 类中设置 Url 参数

问题描述

在创建一个新的 Web API 项目时,您可能会想出需要 url 参数、正文值和查询的控制器端点,尤其是对于 PATCH 路由。

因此,让我们假设您想通过更改产品的数量来更新您的购物篮。端点需要来自 url 的订单 ID 和产品 ID 以及来自正文的金额。

[HttpPatch("{orderId}/products/{productId}")]
public async Task<IActionResult> Update(Dto dto)
{
    return Ok(dto);
}

匹配Dto应该保存整个请求中的值

public class Dto
{
    [FromRoute]
    public int OrderId { get; set; }

    [FromRoute]
    public int ProductId { get; set; }

    [FromBody]
    public int Amount { get; set; }
}

通过 PATCH https://localhost:5001/orders/123/products/456 Amount调用 API 时是正确的,但两个 ID 参数都是 0。我认为它们不会被设置并且将具有它们的默认值。

我错过了什么吗?

标签: c#.netasp.net-core.net-coreasp.net-core-webapi

解决方案


我有同样的问题。这对我有帮助。

在控制器中,您需要指定 [FromRoute]:

[HttpPatch("{orderId}/products/{productId}")]
public async Task<IActionResult> Update([FromRoute] Dto dto)
{
    return Ok(dto);
}

在 DTO 中,在应该从 body 中获取的字段上,需要指定 [FromBody]:

public class Dto
{
    public int OrderId { get; set; }

    public int ProductId { get; set; }

    [FromBody]
    public int Amount { get; set; }
}

推荐阅读