Html.DropDownList用于默认SelectListItem,对于常规布尔值没有任何值

时间:2018-12-19 15:18:57

标签: c# asp.net selectlist dropdownlistfor selectlistitem

我整天都在忙于解决这个问题,所以我决定在这里寻求帮助,希望您能提供帮助。

我的观点如下:

  @Html.DropDownListFor(model => model.IsProduction, new SelectList(new[]
   {
           new SelectListItem { Value = "", Text = "Select environment", Selected = true, Disabled = true },
           new SelectListItem { Value = "false", Text = "Test" },
           new SelectListItem { Value = "true", Text = "Production" }
   },
   "Value", "Text"),
   new { @class = "form-control", @id = "selectEnvironment" })

如您所见,这是一个布尔值的下拉列表,该下拉列表中有3个值。第一个是我要默认选择的内容(尽管不是),然后是“ true”和“ false”的值。

模型中的布尔不是可为空的,也不应该为可为空。只要未选择“ true”或“ false”,该表单将无法提交。

我的问题是:有人可以看到,尽管我定义了默认情况下选择的“”值,但为什么默认情况下总是选择“ false”值?

我尝试了不带“ Disabled”属性的情况,并且它什么也没有改变。

感谢您的帮助,也许您可​​以给予:)

1 个答案:

答案 0 :(得分:1)

摘要:这是bool属性的预期行为,其默认值为false

我相信您设置了IsProduction个布尔属性,如下所示:

[Required]
public bool IsProduction { get; set; }

由于这是不可空的布尔属性,因此默认值设置为false(请参见this reference),并且如果没有值,则默认情况下将选择任何包含false值的选项分配给该属性,该属性会覆盖Selected实例的SelectListItem属性设置。

如果将bool更改为Nullable<bool>(不应该这样),则会选择Selected = true中的任何选项,而不是this fiddle中所示,因为Nullable<bool>的默认值为null,而不是false

此外,如果您检查reference source,还有名为SelectInternal()GetSelectListWithDefaultValue()的私有方法,这些方法用来控制DropDownListFor助手的行为。这说明了具有选定选项占位符的DropDownListFor必须绑定到bool?而不是bool的原因。