Asp.net Core model binder accepts random integer for boolean types

淺唱寂寞╮ 提交于 2020-01-15 01:24:33

问题


Given the model has a boolean property:

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

When trying to POST the following payload:

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

To a simple action:

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

The person.IsMale property gets the value of true.

If passing isMale: "foobar" i get an invalid type error

If passing isMale: "0" i get an invalid type error

If passing isMale: "1" i get an invalid type error

If passing isMale: "True" i get true

If passing isMale: "False" i get false

If passing isMale: 0 i get false

If passing isMale: 1 i get true

If passing isMale: 34 (a random int) i get true

Question:

Why it considers that a random integer defaults to true and how to change that behaviour to complain that the type passed in is inappropriate (int instead of bool)?


回答1:


Judging from your examples, any numeric value that is not 0 is interpreted as true which is not strange at all.

The quoted versions "0" and "1" are string types and cannot directly be parsed to bool.

See the documentation for bool.Parse(string).




回答2:


Maybe it is not a perfect solution, but once you send JSON as a request body, such workaround should fit your needs:

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";
      }
    }
  }

In case of variations of 'true' and '1' it'll return 'true', otherwise it'll be 'false'



来源:https://stackoverflow.com/questions/56132879/asp-net-core-model-binder-accepts-random-integer-for-boolean-types

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!