Html.DropDownList для по умолчанию SelectListItem без значения для обычного 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" })

Как видите, это выпадающий список для bool с 3 значениями в выпадающем списке. Во-первых, это то, что я хочу выбрать по умолчанию (хотя это не так), а затем значения "true" и "false".

Bool в модели не может быть обнуляемым и не должно быть обнуляемым. Форма не сможет быть отправлена, если не выбрано "true" или "false".

Мой вопрос здесь: кто-нибудь может понять, почему по умолчанию всегда выбирается "ложное" -значение, хотя я определил "" -значение, выбранное по умолчанию?

Я пробовал это без атрибута "Disabled", и это ничего не меняет.

Спасибо за любую помощь, которую вы можете оказать:)

1 ответ

Решение

Резюме: это ожидаемое поведение bool свойство, которое имеет значение по умолчанию false,

Я верю, что у вас есть IsProduction логическое свойство устанавливается следующим образом:

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

Поскольку это ненулевое логическое свойство, значением по умолчанию является false (см. эту ссылку), и любой параметр содержит false значение будет выбрано по умолчанию, если для свойства не назначено значение, которое переопределяет Selected настройка свойства SelectListItem пример.

Если вы измените bool в Nullable<bool> (что вы не должны быть), любой вариант с Selected = true будет выбран вместо этого, как показано в этой скрипке, потому что значение по умолчанию для Nullable<bool> является null вместо false,

Также, если вы изучите источник ссылки, есть частные методы с именем SelectInternal() а также GetSelectListWithDefaultValue() который используется для контроля поведения DropDownListFor помощник. Это объясняет причину, почему DropDownListFor с выбранным параметром заполнитель должен связываться с bool? вместо bool,

Другие вопросы по тегам