2010-06-14 42 views
11

可空布尔含该领域的视图模型:MVC地图模型

public bool? IsDefault { get; set; } 

我得到想要的视图中的地图时出现错误:

<%= Html.CheckBoxFor(model => model.IsDefault) %> 

无法隐式转换类型'布尔?到'布尔'。存在明确的转换(您是否缺少演员?)

我试过铸造,并使用.Value,都没有工作。

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

+0

为什么你需要检查模型是否已填充?也许有另一种方式,一种正确的方式,去做你需要做的事情? – AlexanderMP 2010-06-14 09:14:53

+0

可能重复的[为什么CheckBoxFor产生运行时错误](http://stackoverflow.com/questions/2490790/why-is-checkboxfor-producing-runtime-error) – 2011-09-01 12:36:07

回答

13

问题是你真的有三个可能的值; true,false和null,所以CheckBoxFor不能处理三种状态(只有两种状态)。

Brad Wilson在他的博客here上讨论。他使用DropDownList作为可空布尔值。

这个StackOverflow question比上面描述的情况做得更好。解决方案的缺点有时可以为空并不意味着错误,它应该是可空的。这样的一个例子就是您不希望应用真或假的过滤标准。

7

如果你不关心的空值,只想的复选框取消选中时,其空,你可以做到以下几点:

在你的模型像这样创建bool类型的另一个属性:

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

然后,只需使用绑定...

+1

get {_return_ NullableBool == true; } * FIFY – vbullinger 2012-08-07 18:36:10

+1

这对我有用,然后绑定我的CheckboxFor到我的NotNullableBool – Alicia 2017-12-12 12:19:09

2

对我来说,这是好了很多:

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

这对True/False很好,但如果你想处理一个真正的布尔?,你还需要处理Null(想想这个作为是,否和未知。) – Greg 2015-01-21 21:36:23

+0

它确实处理null,因为将检查“Model.IsDefault.HasValue”,发现它为null,并给出'false'。一般来说,我们不关心在'真/假'变量中是否有'空' - 我们只是想知道什么时候是真的/满足的。 – vapcguy 2015-01-23 23:07:45

+2

通常这是事实。但是有时候人们想知道已知的真实的,已知的虚假的,以及不知道的/不知道的。 我们有像已婚的领域。但是我们想知道他们确实被选为已婚,或者选择未婚,或者如果没有输入数据。如果多人处理记录,那么下一个可能会问这个问题是否从未问过。但是,如果你只是表明它是假的,人们会认为它被要求并返回为假。 – Greg 2015-03-17 20:14:10

0

为了增加vapcguy回答,另一个更“干净”的方式来做到这就像如下

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

或者

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

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

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

下面是如何在bullable布尔bool?财产在DropDownListFor地图:

@model SomeModel 

<!-- ...some HTML... --> 

@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通过使用不可为空代理属性作为一种解决方法:

在视图模型:

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

在查看:

@model SomeModel 

<!-- ...some HTML... --> 

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

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

欲了解更多信息,请致电read here

+0

谢谢你为复选框的例子工作 – Alicia 2017-12-12 12:16:43