Выбранное значение в выпадающем списке asp.net MVC 4.0 - PullRequest
4 голосов
/ 19 января 2012

Я пытаюсь создать выпадающий список, используя функцию DropdownListFor, и я хочу, чтобы в нем было выбрано значение.

Я много искал и нашел похожее решение с * 1004.* объект в ViewModel, я пробовал что-то вроде этого

В моем ViewModel я использовал свойство типа SelectList как этот

SelectList HoursToSelect = new SelectList(MyDictionaryObject, "Value", "Key", 14/*selected value*/);

, и я использовал еговот так

@Html.DropDownListFor(m => m.EndsOnHour, HoursToSelect)

Все это работало нормально и полностью выполнило мое требование

Но проблема в том, что из-за архитектуры моего проекта я не могу использовать объект SelectList в своем ViewModel в качестве моегоПроект не допускает непериализуемый класс в ViewModel.

Так что мне остается только оставить что-то в моем представлении, что-то здесь

 @Html.DropDownListFor(m => m.EndsOnHour, new SelectList(Model.Hours, "Value", "Key"))

Но неЗнаешь что!У кого-нибудь есть идея этого добиться?

Ответы [ 2 ]

4 голосов
/ 20 января 2012

Когда вы используете @Html.DropDownListFor(...) со свойством объекта, оно будет использовать текущее состояние объекта для установки выбранного элемента.Так что в вашем примере, если вы не укажете значение в списке выбора, оно будет использовать значение m.EndsOnHour для установки выбранного значения.Фактически, список выбора даже не обязательно должен быть SelectList, скажем так, он просто должен быть набором SelectListItem с, как вы можете видеть в документации .

Однако ваша проблема сериализации все еще существует.Здесь у вас есть пара вариантов, самый простой из которых - просто выбросить значения на стороне представления, если это возможно.Многие выпадающие списки созданы для статического выбора, чтобы отобразить возможные варианты выбора перечисления, например, перечисление состояний или стран.Другие распространенные примеры относятся к диапазонам дат и т. Д. В этих случаях вы можете написать помощников, которые будут генерировать эти списки и вызывать их в вашем представлении, а затем просто удалить их из модели представления.

Если список динамическийоднако в долгосрочной перспективе это не будет работать очень хорошо и, скорее всего, приведет к дополнительному соединению, что негативно скажется на обслуживании вашей системы.В этом случае вам потребуется создать собственный дочерний класс SelectList, который можно сериализировать, а затем использовать его в качестве параметра универсального типа сериализуемой реализации IEnumerable<T>.Массивы в C # являются сериализуемыми, так что вы об этой части позаботились.

3 голосов
/ 04 апреля 2012

Лично я отказался от DropDownListFor и просто сделал что-то вроде этого .... Это намного проще. Не уверен, есть ли какая-то причина, почему это не будет хорошей идеей.

<select id="details-title">
@foreach (var title in Helper.Titles)
{
<option value="@title.Value" @(title.Value==Model.SelectedTitle?"selected=\"selected\" ":"")>@title.Text</option>
}
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...