如何将 ASP.NET Core 5 Web API 控制器操作的失败模型验证结果包装到另一个类中并返回正常响应

Tib*_*tim 1 c# validation asp.net-core asp.net-core-middleware clean-architecture

我有 ASP.NET Web API 控制器和一些操作(方法)。让我们这样说:

[HttpPost]
public async Task<ActionResult> SavePerson([FromBody]PersonDto person)
{
    await _mediatr.Send(new SavePerson.Command(person));
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

PersonDto看起来像这样

public record PersonDto([Required, MinLength(3)]string Name, int? Age);
Run Code Online (Sandbox Code Playgroud)

当我使用无效的人员数据(Name.Length < 3 等)调用 Web API 操作“SavePerson”时,ASP.NET Core 模型绑定验证会中断执行并返回 400(错误请求)。当我传递有效的人员数据时,它工作正常。

我的问题是:

  1. 我怎样才能捕获这个模型绑定验证结果(400 Bad Request)并将其转换为不同的格式,以便我们的前端开发人员会高兴?
  2. 我应该在 Web API 层验证我的 DTO (PersonDto) 还是最好在 MediatR 命令处理程序中验证它?我正在努力遵循鲍勃叔叔的清洁架构。我有域、应用程序、基础设施、Web API。我的 MediatR CQRS 处理程序放置在应用程序层中。

Moh*_*ast 6

默认情况下启用自动 400 错误请求响应。要禁用它,请在启动方法中使用以下代码ConfigureServices

services.Configure<ApiBehaviorOptions>(options =>
{
     options.SuppressModelStateInvalidFilter = true;
});
Run Code Online (Sandbox Code Playgroud)

然后您可以像这样手动处理无效的模型状态:

[HttpPost]
public async Task<ActionResult> SavePerson([FromBody]PersonDto person)
{
    if(!ModelState.IsValid)
        return BadRequest(ModelState);// or what ever you want
    await _mediatr.Send(new SavePerson.Command(person));
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)