2012-01-19 4 views
4

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

Я искал много и нашел подобного рода решения, имеющие SelectList объект в ViewModel, я пытался что-то вроде этого

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

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

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

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

Это все работает нормально, в й выполнил мое требование полностью

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

Таким образом, единственный оставшийся путь для меня, чтобы иметь что-то только мой взгляд, что-то здесь

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

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

ответ

4

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

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

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

3

Лично я сдался с 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> 
+3

проверки на стороне клиента была быть сделано вручную. Пользовательские адаптеры моделей требуют более ручной адаптации для работы с этим. Нет привязки к возможно определенным EditorTemplates. И, больше кода. Это последнее не плохо для определения, но копирование этого цикла foreach во все представления, в которых указан раскрывающийся список. 'DropDownListFor' на самом деле прекрасный способ создать раскрывающийся список, просто привяжите его к свойству на вашей модели, и все в порядке.Если по какой-то причине вам действительно не нравится этот метод (потратьте более пяти минут на это), лучший способ - создать свой собственный HTML-помощник. –

Смежные вопросы