Html.DropDownListFor 默认 SelectListItem 没有常规布尔值

Html.DropDownListFor default SelectListItem with no value for regular bool

我整天都在摸索这个问题,所以我决定在这里寻求帮助,希望你能提供帮助。

我在视图中有以下内容:

  @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" 属性的情况下尝试过,但没有任何改变。

感谢您提供的任何帮助:)

总结: 这是 bool 属性 的预期行为,默认值为 false.

我相信你有 IsProduction 布尔值 属性 设置如下:

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

因为这是不可为 null 的布尔值 属性,默认值设置为 false(参见 this reference),任何包含 false 值的选项都将是当没有值分配给 属性 时默认选择,它会覆盖 SelectListItem 实例的 Selected 属性 设置。

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

此外,如果您检查 reference source,还有名为 SelectInternal()GetSelectListWithDefaultValue() 的私有方法,它们用于控制 DropDownListFor 助手的行为。这解释了为什么带有选定选项占位符的 DropDownListFor 必须绑定到 bool? 而不是 bool.

的原因