Html.DropDownList для по умолчанию SelectListItem без значения для обычного bool - PullRequest
0 голосов
/ 19 декабря 2018

Я целый день возился с этой проблемой, поэтому я решил попросить о помощи здесь, и, надеюсь, вы можете помочь.

У меня есть следующее мнение:

  @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».

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

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

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

1 Ответ

0 голосов
/ 20 декабря 2018

Сводка: Это ожидаемое поведение свойства bool со значением по умолчанию false.

Я считаю, что у вас установлено логическое свойство IsProduction, например:

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

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

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

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

...