ASP.NET MVC DropDownListFor не соблюдает SelectListItem.Selected
Я использую DropDownListFor
сделать выпадающий список в представлении. Каким-то образом отрендеренный список не выбирает SelectListItem
с Selected
установлен в true
,
В действии контроллера:
var selectList = sortedEntries.Select(entry => new SelectListItem
{
Selected = entry.Value.Equals(selectedValue),
Text = entry.Value,
Value = entry.Id
});
return View(new DropDownListModel
{
ListId = id,
SelectList = selectList,
OptionLabel = "Click to Select"
});
По мнению:
<%= Html.DropDownListFor(m => m.ListId,
Model.SelectList,
Model.OptionLabel,
new {@class="someClass"}) %>
Я пробовал следующее:
- убедитесь, что есть один и только один элемент с
Selected
установлен вtrue
, - удалите аргумент метки опции.
- удалить объект атрибута HTML.
- использование
SelectList
вDropDownListFor
:
Html.DropDownListFor(m => m.ListId,
new SelectList(Model.SelectList, "Value", "Text",
new List<SelectListItem>(Model.SelectList).Find(s => s.Selected)),
new {@class="someClass"})
Любые предложения относительно того, что пошло не так?
РЕДАКТИРОВАТЬ:
Дополнительная информация:
- Это действие является дочерним действием, вызываемым другим представлением с
HTML.RenderAction
4 ответа
Попробуйте вот так:
var selectList = sortedEntries.Select(entry => new SelectListItem
{
Text = entry.Value,
Value = entry.Id
});
return View(new DropDownListModel
{
// The drop down list is bound to ListId so simply set its value
// to some element value in the list and it will get automatically
// preselected
ListId = selectedValue,
SelectList = selectList,
OptionLabel = "Click to Select"
});
и в представлении:
<%= Html.DropDownListFor(
m => m.ListId,
new SelectList(Model.SelectList, "Value", "Text"),
Model.OptionLabel,
new { @class = "someClass" }
) %>
Может быть еще одна ошибка: вы пытаетесь изменить выбранное значение в действии POST. Например, вы рендерили форму, пользователь выбрал какое-то значение в раскрывающемся списке, отправил форму, и в вашем действии POST вы выполняете некоторую обработку этого выбранного значения, а при повторном отображении представления вы хотите, чтобы в раскрывающемся списке было выбрано какое-то другое значение., В этом случае вам придется удалить начальный выбор, который содержится в ModelState, или помощник Html проигнорирует выбранное значение в модели:
// do this before returning the view and only if your scenario
// corresponds to what I described above
ModelState.Remove("ListId");
DropDownListFor всегда будет выбирать значение, для которого предназначен список, поэтому в этом случае он будет смотреть на значение ListId и делать этот элемент в выбранном списке. Если ListId не найден в списке, будет выбран первый элемент (или текст по умолчанию). Если вы хотите список, который выбирается на основе выбранного атрибута, используйте DropDownList (без For, в этом случае вы должны назвать его самостоятельно).
Так что в вашем случае это будет работать:
var selectList = sortedEntries.Select(entry => new SelectListItem
{
Text = entry.Value,
Value = entry.Id
});
return View(new DropDownListModel
{
ListId = selectedValue,
SelectList = selectList,
OptionLabel = "Click to Select"
});
Я получил ту же проблему на той же модели (с другими моделями в решении нет проблем)
Не работает:
@Html.DropDownListFor(o => o.Drivers.ValueListItems.Value, Model.Drivers.ValueListItems, new { size = Model.Drivers.ValueSizeList, Multiple = "multiple" })
Работает отлично, элементы выбраны:
@Html.DropDownListFor(o => o.Drivers.ValueListItems.ToDictionary(u=>u.Value).Values, Model.Drivers.ValueListItems, new { size = Model.Drivers.ValueSizeList, Multiple = "multiple" })
Решение этой проблемы проще, чем мы все думаем...
Все, что нам нужно сделать, это установить свойство в модели представления для элемента, с которым связан раскрывающийся список, например: ListId = 3
таким образом, когда мы делаем это
Html.DropDownListFor(m => m.ListId,
new SelectList(Model.SelectList, "Value", "Text",
new List<SelectListItem>(Model.SelectList).Find(s => s.Selected)),
new {@class="someClass"})
HtmlHelper автоматически выберет значение по умолчанию для отображения в DropDownList
Simples!
Надеюсь, что это может помочь вам и всем остальным - как я! - которые потеряли много времени в поисках решения этой очевидной проблемы.