【问题标题】:Asp.net Core model binder accepts random integer for boolean typesAsp.net Core 模型绑定器接受布尔类型的随机整数
【发布时间】:2019-10-01 15:01:31
【问题描述】:

假设模型具有布尔属性:

public class Person
{
    public string Name { get; set; }
    public bool IsMale { get; set; }
}

当尝试发布以下负载时:

{
    "name": "Bob",
    "isMale": 12345 // any random integer
}

到一个简单的动作:

[HttpPost]
public IActionResult Post([FromBody] Person person)
{
    if (ModelState.IsValid)
        return Ok();
    return BadRequest(ModelState);
}

person.IsMale 属性获取true 的值。

如果通过 isMale: "foobar" 我得到一个无效类型错误

如果通过isMale: "0" 我得到一个无效类型错误

如果通过 isMale: "1" 我得到一个无效类型错误

如果通过isMale: "True" 我得到true

如果通过isMale: "False" 我得到false

如果通过isMale: 0 我得到false

如果通过isMale: 1 我得到true

如果通过isMale: 34(一个随机整数)我得到true

问题:

为什么它认为随机整数默认为true,以及如何更改该行为以抱怨传入的类型不合适(int 而不是 bool)?

【问题讨论】:

  • 0 和 1 显然被视为布尔值。不过,我也很好奇如何防止 0 和 1 被强制转换为 bool 值。
  • @Skrface 我知道在传统的 web api / mvc 中,您必须编写自定义模型绑定器,以便从 int 转换为 bool,或从 string 转换为 bool。我真的不明白为什么随机数被认为是true。看起来像是避免额外开销的技巧。

标签: asp.net-core asp.net-core-webapi model-binding


【解决方案1】:

从您的示例来看,任何不是0 的数值都会被解释为true,这并不奇怪。

引用的版本"0""1"string类型,不能直接解析为bool

请参阅bool.Parse(string) 的文档。

【讨论】:

  • 您能否详细说明为什么将非零视为错误是一个好主意。 (我从合同定义/验证的角度来看)
  • bool 类型只是单个位的语法糖,可以是0,例如false,或1,例如true。您没有将非零视为false,而是将其视为true,因为它的值高于0
【解决方案2】:

也许这不是一个完美的解决方案,但是一旦您将 JSON 作为请求正文发送,这样的解决方法应该可以满足您的需求:

public class Person
  {
    public string Name { get; set; }

    [JsonProperty("isMale")]
    public string IsMaleString { private get; set; }

    [JsonIgnore]
    public bool IsMale
    {
      get
      {
        return bool.TryParse(IsMaleString, out bool value)
          ? value
          : IsMaleString == "1";
      }
    }
  }

如果 'true' 和 '1' 不同,则返回 'true',否则返回 'false'

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2018-06-21
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多