ASP.NET MVC DropDownListFor не поддерживает SelectListItem.Selected - PullRequest
7 голосов
/ 14 июля 2011

Я использую 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 in 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 ]

6 голосов
/ 14 июля 2011

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"
});
5 голосов
/ 13 сентября 2012

У меня та же проблема на той же модели (с другими моделями в решении нет проблем)

Не работает:

@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" })
4 голосов
/ 14 июля 2011

Попробуй так:

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");
0 голосов
/ 01 июля 2014

Решение этой проблемы проще, чем мы все думаем ...

Все, что нам нужно сделать, - это установить свойство в модели представления для элемента, с которым связан раскрывающийся список, то есть: 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!

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

...