Выпадающий список для (…) выбора логического значения false по умолчанию

#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-2

#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-2

Вопрос:

У меня типичный выпадающий список YesNo в приложении. Для этого я разработал класс model (скорее ViewModel Utility) для будущего расширения prupose.

 public string Text { get; set; } // represents text part
        public bool Value { get; set; } // represent value
        public List<DropDown> DropDowns { get; set; } //list for binding
        public void BuildYesNoDropDown()
        {
            DropDowns = new List<DropDown>();
            DropDowns.Add(new DropDown { Text = "Yes", Value = true });
            DropDowns.Add(new DropDown { Text = "No", Value = false });
        }
  

Затем я привязываю его к виду следующим образом:

 @Html.DropDownListFor(x => x.SelectedValue, new SelectList(Model.DropDowns, "Value", "Text",1),"Select") //last para - OptionLabel
  

В представлении отображаются все три параметра, то есть «Выбрать», «Да» и «Нет». Но по умолчанию выбрано «Нет». Если я задаю свойство «Value» как целое число, тогда оно работает нормально, и по умолчанию выбирается «Select», но, как указано в коде, если я склонен использовать тип bool, тогда выбирается «Нет».

Как добиться нормального поведения, когда значение DataValueField равно bool ?

Ответ №1:

ViewModel

 public bool flag { get; set; }
  

Вид

 @Html.DropDownListFor(model => model.flag, new List<SelectListItem>()
{
   new SelectListItem() { Text = "Yes", Value = "True" },
   new SelectListItem() { Text = "No", Value = "False"}
}, "Select.....", new { @id = "flag", @class="form-control" })
@Html.ValidationMessageFor(model => model.flag)
  

Комментарии:

1. Это не работает, если у вас есть [Required] аннотации данных к модели.

2. Правильно, необходимо будет использовать проверку javascript.

3. Для меня это сработало как шарм! Я просто пропустил третий параметр «Выбрать …..», поскольку я имел дело с обязательным полем, чтобы оно всегда заполнялось.

Ответ №2:

Модель:

 public bool? Value { get; set; }
  

Вид:

 @Html.EditorFor(model => model.Value)
  

Это автоматически создает выпадающий список с 3 состояниями, которые соответствуют 3 состояниям обнуляемого bool: null, true, false . Если вам требуется, чтобы на это значение был дан ответ, вы можете использовать аннотации данных следующим образом:

Модель:

 [Required]
public bool? Value { get; set; }
  

Вывод заключается в том, что ваша модель должна быть реальной моделью — она должна моделировать входные значения от unset до set . Если вам нужно ввести a int , вы, вероятно, захотите использовать nullable int (so int? ) и потребовать значение. Таким образом, начальное значение равно null вместо 0. Аналогично с другими типами данных, за исключением string того, который уже имеет значение null .

Комментарии:

1. Спасибо за ответ. Но, я думаю, мой вопрос был неправильно понят. В настоящее время для значения bool по умолчанию выбрано значение «НЕТ». Вместо этого я хочу «Выбрать», какой параметр должен быть выбран.

2. Я позволю кому-нибудь другому ответить на этот вопрос — вам нужно предоставить DropDown для них модель.

3. У вас недостаточно репутации, чтобы опубликовать код обратно … 🙁 Я думаю, проблема в типе лямбда-выражения. В приведенном выше коде x=>x.Тип выбранного значения — bool . Это заставляет движок выбирать последнее значение «false» в предоставленной коллекции. Хотя я не уверен!

4. Мои неадекватные знания о DropDownListFor(…) потратили ваше время впустую. x=>x.Выбранное значение, которое не задано, и его значение по умолчанию равно false. Следовательно, из списка он выберет любое значение false . Ваше обнуляемое решение будет здесь кстати. Спасибо за ваше время.

5. У нас это не работает. Параметр по умолчанию «НЕ УСТАНОВЛЕН» без значения не пройдет проверку.

Ответ №3:

В моем случае у меня была куча этих выпадающих списков на одной странице, и я подумал, что буду умным и повторно использую список выбора, например

 var YesOrNoTriState = new List<SelectListItem> {
  new SelectListItem { Text = "Select", Value = "" },
  new SelectListItem { Text = "Yes", Value = true.ToString() },
  new SelectListItem { Text = "No", Value = false.ToString() }
};
  

и в представлении

 <%: Html.DropDownListFor(x => x.Field1, Model.YesOrNoTriState) %>
<%: Html.DropDownListFor(x => x.Field2, Model.YesOrNoTriState) %>
  

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

Ответ №4:

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

по умолчанию выбрано значение no, поскольку значение bool по умолчанию равно false

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

 public bool? Value { get; set; }
  

а затем вы просто устанавливаете свой выпадающий список следующим образом в представлении:

 @Html.DropDownListFor(x => x.SelectedValue, new SelectList(Model.DropDowns, "Value", "Text",1),"{Default Select Value}")
  

результатом этого должно быть то, что когда значение bool равно нулю, автоматически выбранная опция должна быть вашим значением по умолчанию {Default Select Value}