Я пытаюсь понять лучший способ реализовать a DropDownList
в ASP.NET MVC 2 с помощью DropDownListFor
помощник. Это - многослойный вопрос.
Во-первых, что лучший способ состоит в том, чтобы передать данные списка представлению?
SelectList
свойство, которое содержит данныеViewData
Как я вкладываю пустое значение DropDownList
? Если я создаю его в SelectList
когда я создаю его или являюсь там некоторыми другими средствами сказать, что помощник к автоматическому создает пустую стоимость?
Наконец, если по некоторым причинам существует серверная ошибка, и я должен вновь отобразить экран с DropDownList
, я должен выбрать значения списка снова для передачи в модель представления? Эти данные не сохраняются между сообщениями (по крайней мере, не, когда я передаю их с помощью своей модели представления), таким образом, я собирался просто выбрать их снова (они кэшируются). Я иду об этом правильно?
Лучше всего создать список SelectList в вашем контроллере - используйте мой метод расширения здесь: http://blog.wekeroad.com/2010 / 01/20 / my-favourite-helpers-for-aspnet-mvc
Вставить это в ViewData, используя тот же ключ, что и имя вашего свойства:
ViewData ["statusid"] = MySelectList
Затем просто используйте Html.DropDownFor (x => x.StatusID)
, и все готово.
Вы можете сделать что-то вроде:
<%= Html.DropDownListFor((x => x.ListItems), Model.ListItems, "")%>
или
<%= Html.DropDownList("ListItems", Model.ListItems, "")%>
Последний параметр 'optionLabel' создает пустой элемент списка
В этом случае вы можно увидеть, что ListItems - это свойство модели.
Я также сделал вид строго типизированным для модели.
(Вы это уже знаете!)
Да, добавьте его при построении SelectList. (Если вы строите список с помощью LINQ, Union может пригодиться.)
Да, да, да, да.
Отвечаю по частям:
Лучший способ IMHO - передать список в ViewModel
вот так:
public SelectList Colors
{
get
{
// Получение списка Colors, например, из базы данных...
List colors = GetColors().ToList();
// Возвращаем SelectList для использования на стороне представления
return new SelectList(colors, "Value", "Name");
}
}
Чтобы получить пустой или стандартный вариант, например ( -- Выберите цвет -- ), вы можете сделать это на стороне представления:
@Html.DropDownListFor(m => m.Color, Model.Colors, "-- Выберите цвет --")
Вам придется снова получить/наполнить список, если он является частью ViewModel
.
Посмотрите следующую статью в блоге. Она может дать вам несколько советов:
Я считаю более интуитивным работать с последовательностью SelectListItems (а не с SelectList).
Например, это создаст IEnumerable
из последовательности объектов клиентов, которые вы можете передать вспомогательному модулю Html.DropDownListFor (...). Свойство «Выбрано» может дополнительно установить элемент по умолчанию в раскрывающемся списке.
var customers = ... // Get Customers
var items = customers.Select(c => new SelectListItem
{
Selected = (c.Id == selectedCustomerId),
Text = c.Email,
Value = c.Id.ToString()
});