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"}) %>

Я пробовал следующее:

  1. убедитесь, что есть один и только один элемент с Selected установлен в true,
  2. удалите аргумент метки опции.
  3. удалить объект атрибута HTML.
  4. использование 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!

Надеюсь, что это может помочь вам и всем остальным - как я! - которые потеряли много времени в поисках решения этой очевидной проблемы.

Другие вопросы по тегам