MVC映射到模型中的可空bool

使用包含该字段的视图模型:

public bool? IsDefault { get; set; } 

尝试在视图中映射时出错:

  model.IsDefault) %> 

无法隐式转换类型’bool?’ ‘bool’。 存在显式转换(您是否错过了演员?)

我已经尝试过使用.Value并且都没有工作。

请注意我想要的行为是提交表单应该将模型中的IsDefault设置为true或false。 值null仅表示尚未填充模型。

问题是你真的有三个可能的价值观; true,false和null,因此CheckBoxFor无法处理三种状态(只有两种状态)。

布拉德威尔逊在他的博客上讨论。 他使用DropDownList来获取可空的布尔值。

这个StackOverflow 问题比我上面描述的情况要好得多。 解决方案的缺点有时是可空的并不意味着错误,它应该是可以为空的。 例如,您不希望应用true或false的过滤条件。

如果您不关心null值,并且只想在复选框为null时取消选中该复选框,则可以执行以下操作:

在您的模型中创建另一个bool类型的属性,如下所示:

 public bool NotNullableBool { get { return NullableBool == true; } set { NullableBool = value; } } 

然后用它来绑定……

对我来说,这要好得多:

 <%= Html.CheckBox("IsDefault", Model.IsDefault.HasValue? Model.IsDefault : false) %> 

这是如何映射一个可膨胀的布尔bool? DropDownListFor属性:

 @model SomeModel  @Html.DropDownListFor(m => m.NullableBooleanProperty, new SelectList( new[] { new { Value = "", Text = "-- Choose YES or NO --" }, new { Value = "true", Text = "YES" }, new { Value = "false", Text = "NO" }, }, "Value", "Text" )) 

以下是使用非可空代理属性作为解决方法将其映射到CheckBoxFor的方法:

在ViewModel中:

 public bool NullableBooleanPropertyProxy { get { return NullableBooleanProperty == true; } set { NullableBooleanProperty = value; } } 

在视图中:

 @model SomeModel  @Html.CheckBoxFor(m => m.NullableBooleanPropertyProxy) 

此解决方法的唯一缺点是null值将被视为false :如果您不能接受,则最好使用可支持三种状态的控件,例如前面提到的DropDownListFor

有关详细信息,请在我的博客上阅读此文章 。

要添加到vapcguy答案,另一种更“清洁”的方法就是如下

 @Html.CheckBox("IsDefault", Model?.IsDefault) 

要么

 <%= Html.CheckBox("IsDefault", Model?.IsDefault) %> 

您可以创建一个编辑器模板来呈现可为空的布尔值的复选框。 将模板命名为Boolean.cshtml,以将其用作站点中所有布尔属性的默认值。 确保该文件位于〜/ Views / Shared / EditorTemplates文件夹中

 @model bool? @Html.CheckBox(String.Empty, Model??false)