【问题标题】:How to return 400 when [FromBody] object can't bind anything [duplicate]当[FromBody]对象无法绑定任何东西时如何返回400 [重复]
【发布时间】:2022-01-27 20:49:31
【问题描述】:

假设我的客户有一个 PUT 请求,我想处理这些数据。使用FromBody 属性,我可以获得绑定数据。但是当没有数据绑定到我的 [FromBody] 对象时,我想向我的客户发送 400。因为如果我不这样做,我将使用一个成员无缘无故地为空/默认的对象来更新我的数据库。如何在 .NET 5 中解决这个问题?

一个示例函数定义是: public async Task<IActionResult> PutAsync(long id, [FromBody] PersonUpdateDto personUpdateModel)

    public class PersonUpdateDto {
    public string Name {get; set;}
    public string Surname {get; set;}
    }

再次,如果personUpdateModel 中的所有成员都为空,我想向我的客户返回 400。(这意味着没有发生绑定操作)

【问题讨论】:

  • 从您发布的内容来看,这听起来您只需要在函数顶部添加一个简单的 if 语句。你已经试过了吗?
  • 尝试在 PersonUpdateDto 类的 Name 和 Surname 字段中添加 Required 属性
  • @Matt.G 对于PUT 端点来说,必需不是一个好的设计,因为客户端可以选择不更新某个字段。
  • @gunr2171 如果您能提供一个示例if 声明,我将不胜感激

标签: c# .net .net-core automapper .net-5


【解决方案1】:

如果您在控制器上使用[ApiController] 属性,它将处理序列化错误并为您提供 400 响应。它实际上相当于:

if (!ModelState.IsValid)
{
   return BadRequest(ModelState);
}

您可以在此处阅读更多相关信息 - https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-2.2#automatic-http-400-responses

【讨论】:

  • 是的,我在我的控制器上使用[ApiController] 属性,如果我错了,请纠正我,这不是用于数据注释吗?我的模型中没有数据注释,因为它是一个 updateDTO,所有字段都应该是可选的,但我想验证至少一个字段已与数据绑定。
猜你喜欢
  • 1970-01-01
  • 2017-10-06
  • 2018-02-07
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多