【问题标题】:.NET Core [FromBody] annotation assigns default value instead of returning 400 error if value is missing.NET Core [FromBody] 注释分配默认值,而不是在缺少值时返回 400 错误
【发布时间】:2021-11-25 15:24:53
【问题描述】:

我创建了一个类似于

的控制器方法
[HttpPost]
public ActionResult<MyDTO> Post([FromBody] MyDTO myDTO)
{
    // do something with myDTO...
    Ok();
}

和 MyDTO:

namespace MyNamespace.DTO
{
    public class MyDTO
    {
        [Required]
        public int someNumber { get; set; }

        [Required]
        public bool someBool { get; set; }

        [Required]
        public DateTimeOffset someDate { get; set; }
    }
}

当我发送带有未定义的 JSON 正文的帖子时,它不会返回 400 或某种异常,而是为其分配默认(虚假)值。

当我定义另一个 DTO 类的 List 时,它确实返回了 400 代码。

如果未提供某些必需值而不是仅使用默认值,如何使 API 返回错误?

【问题讨论】:

    标签: c# api .net-core controller


    【解决方案1】:

    您必须手动控制它。没有其他办法。

    试试类似的东西

    [HttpPost]
    public ActionResult<MyDTO> Post([FromBody] MyDTO myDTO)
    {
        if(YourComprobation(myDto)){
           BadRequest();
        }
        Ok();
    }
    

    【讨论】:

    • 如何阻止 FromBody 为这些字段分配默认值?否则,收到“false”或“0”与什么都没有收到没有区别。
    • 另外,如果 DataAnnotations 不能自动化数据验证过程,是否有理由使用它们?
    • @Asghwor FromBody 将您的 json 映射到您选择的对象。想象一下,你有Post(string id, [FromBody] MyDTO myDTO),你正在做的是从路由中获取 id 变量,例如,从正文中获取 myDTO。我不明白您希望 FromBody 映射器做什么
    • 我明白了。数据注释的目的究竟是什么?此外,我如何验证 JSON 是否存在缺失值、错误类型等?
    • @Asghwor 布尔值的默认值为false,它通过了标签的[Required] 验证。在我提到的YourComprobation 方法中,您必须检查“缺失值”或创建一个自定义标记来执行此操作。
    【解决方案2】:

    找到答案here

    我只需要让所有字段都可以为空并且有一个

    if (!ModelState.IsValid)
       // return 400
    

    在控制器中。

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 2019-06-22
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      相关资源
      最近更新 更多