请考虑我们的模型的属性WillMarry
为bool?
类型。我们可以毫无问题地隐式调用以下所有内容。
obj.WillMarry=null;
obj.WillMarry=false;
obj.WillMarry=true;
现在考虑以下ASP.NET MVC视图页。
<select asp-for="WillMarry">
<option value="">Choose an option</option>
<option value="true">Yes, I will get married</option>
<option value="false">No, I will not get married</option>
</select>
模型绑定可以将value="true"
和value="false"
填充到WillMarry
,ModelState.IsValid
设置为true
。但是,如果我使用ModelState.IsValid
代替false
,则会将value="null"
设置为value=""
。
如果我们可以隐式设置obj.WillMarry=null
,为什么模型绑定不能通过WillMarry
设置null
到value="null"
而不设置ModelState.IsValid
到{{ 1}}?
我可能需要重新解释我的问题如下。
我们可以隐式设置false
,模型活页夹也可以将obj.WillMarry=false
转换为value="false"
。
我们可以隐式设置false
,模型活页夹也可以将obj.WillMarry=true
转换为value="true"
。
我们可以隐式设置true
但是模型绑定器无法将obj.WillMarry=null
(而不是value="null"
)转换为value=""
。
为什么模型绑定中存在这样一种奇怪的行为,仅适用于null
?
答案 0 :(得分:1)
当您提交表单时,您在请求中发送其成功控件的名称/值对。如果您选择$(".txtMult select").on('change', multInputs);
的第一个选项(而不是value="null"
),则会发送value=""
。
请求中发送的所有内容都只是文本(没有类型的概念),WillMarry: null
将值转换为属性类型的责任。在您的情况下,DefaultModelBinder
会在模型中找到匹配的属性名称(属性为DefaultModelBinder
)并尝试通过将文本public bool? WillMarry { get; set; }
转换为"null"
来设置它失败,boolean
无效。
为了表示ModelState
,发送的值必须为空字符串。
答案 1 :(得分:1)
编辑完成后,我将评论重新发布为答案:
建立了模型绑定器,因此它能够转换&#34;&#34; null
为可空的布尔,这是有道理的。
转换&#34; null&#34;到null
可能对c#有意义,但考虑一下,例如,用VB.Net编写的相同代码。
代码是否应转换&#34; null&#34;,&#34; Nothing&#34;并且在null
的每种.NET语言中,所有内容都用作null
?
我同意他们为DefaultModelBinder做的实现