Я пробовал, что это RC1, а затем обновился до RC2, который не решил проблему.
// in my controller
ViewData["UserId"] = new SelectList(
users,
"UserId",
"DisplayName",
selectedUserId.Value); // this has a value
результат: для объекта установлено свойство SelectedValue
// in my view
<%=Html.DropDownList("UserId", (SelectList)ViewData["UserId"])%>
Результат: все ожидаемые параметры отображаются для клиента, но выбранный атрибут не установлен. Элемент в SelectedValue существует в списке, но первый элемент в списке всегда по умолчанию выбран.
Как мне это делать?
Обновление Благодаря ответу Джона Феминеллы я выяснил, в чем проблема. «UserId» - это свойство модели, для которой строго типизировано мое представление. Когда Html.DropDownList ("UserId" изменяется на любое другое имя, кроме "UserId", выбранное значение отображается правильно.
Это приводит к тому, что значение не привязано к модели.
asp.net-mvc
синий
источник
источник
Ответы:
Вот как я исправил эту проблему:
У меня было следующее:
Контроллер:
Посмотреть
Изменено на следующее:
Посмотреть
Похоже, что DropDown не должен иметь то же имя, что и имя ViewData: S странно, но это сработало.
источник
Попробуй это:
А потом:
С MVC RC2 я получаю:
источник
Вы по-прежнему можете назвать DropDown «UserId», и привязка модели по-прежнему будет правильно работать для вас.
Единственное требование для этого - чтобы ключ ViewData, содержащий SelectList, не имел того же имени, что и свойство Model, которое вы хотите привязать. В вашем конкретном случае это будет:
В результате будет создан элемент выбора с именем UserId, имя которого совпадает с именем свойства UserId в вашей модели, и поэтому связыватель модели установит для него значение, выбранное в элементе select HTML, созданном помощником Html.DropDownList.
Я не уверен, почему этот конкретный конструктор Html.DropDownList не выбирает значение, указанное в SelectList, когда вы помещаете список выбора в ViewData с ключом, равным имени свойства. Я подозреваю, что это как-то связано с тем, как помощник DropDownList используется в других сценариях, где соглашение заключается в том, что у вас есть SelectList в ViewData с тем же именем, что и свойство в вашей модели. Это будет работать правильно:
источник
Если мы не думаем, что это ошибка, которую команда должна исправить, в любом случае MSDN должен улучшить документ. Сложность действительно возникает из-за плохого документа. В MSDN это объясняет имя параметров как,
Это просто означает, что конечный HTML-код, который он сгенерирует, будет использовать этот параметр в качестве имени ввода выбора. Но на самом деле это означает нечто большее.
Я предполагаю, что дизайнер предполагает, что пользователь будет использовать модель представления для отображения раскрывающегося списка, а также будет использовать отправку обратно в ту же модель представления. Но во многих случаях мы не следуем этому предположению.
Используйте приведенный выше пример,
Если мы последуем предположению, мы должны определить модель представления для этого представления, связанного с выпадающим списком.
Потому что , когда пост обратно, только выбранное значение будет размещать назад, поэтому предположим , что следует размещать обратно в собственность SelectedPersonId модели, что означает первый параметр Html.DropDownList по имени должно быть «SelectedPersonId». Таким образом, дизайнер считает, что при отображении вида модели в представлении свойство модели SelectedPersonId должно содержать значение по умолчанию для этого раскрывающегося списка. Даже если подумать, что ваши List <SelectListItem> Persons уже установили флаг Selected, чтобы указать, какой из них выбран / по умолчанию, tml.DropDownList фактически проигнорирует это и перестроит свой собственный IEnumerable <SelectListItem> и установит элемент по умолчанию / выбранный на основе имени.
Вот код из asp.net mvc
Итак, код на самом деле пошел дальше, он не только пытается найти имя в модели, но и в данных представления, как только он его найдет, он перестроит selectList и проигнорирует исходное Selected.
Проблема в том, что во многих случаях мы так не используем. мы просто хотим добавить selectList с одним / несколькими элементами.
Конечно, решение простое - используйте имя, которого нет ни в модели, ни в данных представления. Если он не может найти совпадение, он будет использовать исходный список selectList, и исходный Selected вступит в силу.
Но я все еще думаю, что mvc должен улучшить его, добавив еще одно условие
Потому что, если в исходном списке selectList уже был выбран один элемент, почему бы вам его игнорировать?
Только мои мысли.
источник
Код из предыдущего поста MVC 3 не работает, но это хорошее начало. Я починю это. Я протестировал этот код, и он работает в MVC 3 Razor C # Этот код использует шаблон ViewModel для заполнения свойства, которое возвращает
List<SelectListItem>
.Класс модели
Класс ViewModel
Метод контроллера
Вид
Вывод HTML будет примерно таким:
в зависимости от того, как вы форматируете вывод. Надеюсь, это поможет. Код действительно работает.
источник
selected
вариант.Это похоже на ошибку в классе SelectExtensions, поскольку он проверяет только ViewData, а не модель для выбранного элемента. Таким образом, хитрость заключается в том, чтобы скопировать выбранный элемент из модели в коллекцию ViewData под именем свойства.
Это взято из ответа, который я дал на форумах MVC, у меня также есть более полный ответ в сообщении в блоге, в котором используется атрибут Kazi DropDownList ...
Учитывая модель
и базовая модель представления
Затем мы пишем шаблон редактора DropDownList следующим образом:
Это также будет работать, если вы измените ArticleType в модели представления на SelectListItem, хотя вам нужно реализовать преобразователь типов в соответствии с блогом Кази и зарегистрировать его, чтобы связыватель рассматривал его как простой тип.
В вашем контроллере у нас есть ...
источник
Проблема в том, что выпадающие окна не работают так же, как списки, по крайней мере, так, как ожидает дизайн ASP.NET MVC2: Dropbox допускает только ноль или одно значение, так как списки могут иметь выбор из нескольких значений. Таким образом, в строгом соответствии с HTML, это значение должно быть не в списке опций как флаг «selected», а в самом вводе.
См. Следующий пример:
Комбинация имеет выбранный параметр, но также имеет установленный атрибут значения . Итак, если вы хотите, чтобы ASP.NET MVC2 отображал раскрывающийся список, а также выбрал определенное значение (например, значения по умолчанию и т. Д.), Вы должны указать ему значение при визуализации, например:
источник
В ASP.NET MVC 3 вы можете просто добавить свой список в ViewData ...
... а затем назовите его по имени в своем обзоре бритвы ...
Вам не нужно вручную «использовать» список в вызове DropDownList. Поступая таким образом, я правильно установил выбранное значение.
Отказ от ответственности:
источник
Мне удалось добиться желаемого результата, но с немного другим подходом. В раскрывающемся списке я использовал модель, а затем сослался на нее. Не уверен, что это то, что вы искали.
Model.Matters.FeeStructures выше - это мой идентификатор, который может быть вашим значением элемента, который следует выбрать.
источник