Подтвердить что ты не робот

Лучший способ реализовать DropDownList в ASP.NET MVC 2?

Я пытаюсь понять лучший способ реализации DropDownList в ASP.NET MVC 2 с помощью помощника DropDownListFor. Это многочастный вопрос.

Во-первых, каков наилучший способ передать данные списка в представление?

  • Передайте список в вашей модели с помощью свойства SelectList, которое содержит данные
  • Передайте список через ViewData

Как получить пустое значение в DropDownList? Должен ли я создать его в SelectList, когда я его создаю, или есть какие-то другие средства, чтобы сообщить помощнику автоматически создать пустое значение?

Наконец, если по какой-то причине возникает ошибка на стороне сервера, и мне нужно повторно отобразить экран с помощью DropDownList, мне нужно снова получить значения списка, чтобы перейти в модель представления? Эти данные не поддерживаются между сообщениями (по крайней мере, когда я передаю его через мою модель представления), поэтому я собирался просто извлечь его снова (он кэшируется). Правильно ли я это делаю?

4b9b3361

Ответ 1

Лучше всего создать SelectList в своем контроллере - используйте мой метод расширения здесь: http://blog.wekeroad.com/2010/01/20/my-favorite-helpers-for-aspnet-mvc

Попасть в ViewData, используя тот же ключ, что и ваше имя свойства: ViewData["statusid"]=MySelectList

Затем просто используйте Html.DropDownFor(x=>x.StatusID), и вы все настроены.

Ответ 2

Ответы по частям:

  • Лучший способ IMHO - передать список в ViewModel следующим образом:

    public SelectList Colors
    {
        get
        {
            // Getting a list of Colors from the database for example...
            List<Color> colors = GetColors().ToList();
    
            // Returning a SelectList to be used on the View side
            return new SelectList(colors, "Value", "Name");
        }
    }
    
  • Чтобы получить пустую или стандартную опцию, например (- Выберите цвет -), вы можете сделать это со стороны представления:

    @Html.DropDownListFor(m => m.Color, Model.Colors, "-- Pick a color --")
    
  • Вам придется снова отображать/заполнять список, если он является частью ViewModel.


Взгляните на следующее сообщение в блоге. Он может дать вам несколько советов:

Раскрывающиеся списки и ASP.NET MVC

Ответ 3

Вы можете сделать что-то вроде:

<%= Html.DropDownListFor((x => x.ListItems), Model.ListItems, "")%>

или

<%= Html.DropDownList("ListItems", Model.ListItems, "")%>

Последний параметр "optionLabel" делает пустой элемент списка

В этом случае вы можете видеть, что ListItems является свойством модели.

Я сделал вид, который также был типизирован для модели.

Ответ 4

(Вы уже знаете это!)

  • Передайте список в вашей модели с помощью свойства SelectList, содержащего данные

Да, добавьте его, когда вы создадите SelectList. (Если вы создадите список с помощью LINQ, вам может понадобиться Union.)

Да, да, да, да.

Ответ 5

Я считаю более интуитивным работать с последовательностью SelectListItems (а не с SelectList).

Например, это создаст IEnumerable<SelectListItem> из последовательности объектов клиента, которые вы можете передать в помощник Html.DropDownListFor(...). Свойство "Выбранное" будет необязательно задавать элемент по умолчанию в раскрывающемся списке.

var customers = ... // Get Customers
var items = customers.Select(c => new SelectListItem
                             {
                                 Selected = (c.Id == selectedCustomerId),
                                 Text = c.Email,
                                 Value = c.Id.ToString()
                             });