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
,