Asp.net Core 模型绑定器接受布尔类型的随机整数

Posted

技术标签:

【中文标题】Asp.net Core 模型绑定器接受布尔类型的随机整数【英文标题】:Asp.net Core model binder accepts random integer for boolean types 【发布时间】: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。看起来像是避免额外开销的技巧。 【参考方案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'

【讨论】:

以上是关于Asp.net Core 模型绑定器接受布尔类型的随机整数的主要内容,如果未能解决你的问题,请参考以下文章

自定义模型绑定器未针对 ASP.NET Core 2 中的单个属性触发

Asp.Net Core Razor Page PUT Handler 模型绑定器未绑定来自 ajax put 上的 java 脚本的序列化表单

将自定义模型绑定器应用于 asp.net 核心中的对象属性

复杂对象和模型绑定器 ASP.NET MVC

为啥 ASP.Net MVC 模型绑定器将空 JSON 数组绑定到 null?

使用模型绑定器时在 ASP.NET MVC 中往返视图数据