0

我正在开发一个 Asp.Net Core API。

我的控制器声明

[ApiController]
public class BarController : Controller
{
    ...
}

我的端点看起来像这样

[HttpPost, Route("bars")]
public async Task<ActionResult> DoAsync(
    [FromBody] UpdateBars command)
{
    // Do something with the command
    return Ok(result);
}

命令看起来像这样

public class UpdateBars
{
    [Required]
    public IEnumerable<string> Ids { get; set; }

    // ... more properties
}

兼容性级别设置为 2.1

public IServiceProvider ConfigureSharedServices(IServiceCollection services)
{
    // ...
    services.AddMvc()
        .AddControllersAsServices()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    // ...
}

老问题:我希望这会返回一个缺少 Ids 参数的 400 错误请求,但它无法返回绑定错误。我究竟做错了什么?

更新的问题:我希望这会返回一个 400 错误请求,其中缺少或为空的 Ids 参数。如果参数丢失(null),则响应符合预期,但如果它是空集合,则返回 200 ok。是否可以更改某些内容,以便在参数存在但为空时收到错误的请求?

4

2 回答 2

0

您可能没有[ApiController]在控制器上放置属性。

默认情况下,验证不是“自动”的。如果您不想将该属性放在控制器上,则必须自己验证模型,方法如下:

[HttpPost, Route("bars")]
public async Task<ActionResult> DoAsync(
    [FromBody] UpdateBars command)
{
    if (!ModelState.IsValid)
    {
       return BadRequest(ModelState);
    }
    // Do something with the command
    return Ok(result);
}

这样你就有了更多的控制权,但如果你只需要返回带有模型状态的 a ,如果你把它放在控制器上BadRequest它会自动发生。[ApiController]

同样在这种情况下,它会将所有操作参数标记为[FromBody],因此不需要将该属性放在 params

于 2020-05-21T19:38:15.467 回答
0

您应该添加该[ApiController]属性。在这种情况下,当模型状态无效时,会返回包含错误详细信息的自动 HTTP 400 响应。有关详细信息,请参阅自动 HTTP 400 响应。自动 HTTP 400 响应。

于 2020-05-21T19:04:29.207 回答