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 脚本的序列化表单