#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}