为什么我们不能将null设置为可空类型的select元素的选项?

时间:2016-10-16 06:34:05

标签: c# asp.net asp.net-mvc

请考虑我们的模型的属性WillMarrybool?类型。我们可以毫无问题地隐式调用以下所有内容。

  • 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"填充到WillMarryModelState.IsValid设置为true。但是,如果我使用ModelState.IsValid代替false,则会将value="null"设置为value=""

问题

如果我们可以隐式设置obj.WillMarry=null,为什么模型绑定不能通过WillMarry设置nullvalue="null"而不设置ModelState.IsValid到{{ 1}}?

修改

我可能需要重新解释我的问题如下。

  • 我们可以隐式设置false,模型活页夹也可以将obj.WillMarry=false转换为value="false"

  • 我们可以隐式设置false,模型活页夹也可以将obj.WillMarry=true转换为value="true"

  • 我们可以隐式设置true但是模型绑定器无法将obj.WillMarry=null(而不是value="null")转换为value=""

为什么模型绑定中存在这样一种奇怪的行为,仅适用于null

2 个答案:

答案 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做的实现