Лучший способ реализовать DropDownList в ASP.NET MVC 2?
Я пытаюсь понять лучший способ реализации DropDownList
в ASP.NET MVC 2 с помощью помощника DropDownListFor
. Это многочастный вопрос.
Во-первых, каков наилучший способ передать данные списка в представление?
- Передайте список в вашей модели с помощью свойства
SelectList
, которое содержит данные
- Передайте список через
ViewData
Как получить пустое значение в DropDownList
? Должен ли я создать его в SelectList
, когда я его создаю, или есть какие-то другие средства, чтобы сообщить помощнику автоматически создать пустое значение?
Наконец, если по какой-то причине возникает ошибка на стороне сервера, и мне нужно повторно отобразить экран с помощью DropDownList
, мне нужно снова получить значения списка, чтобы перейти в модель представления? Эти данные не поддерживаются между сообщениями (по крайней мере, когда я передаю его через мою модель представления), поэтому я собирался просто извлечь его снова (он кэшируется). Правильно ли я это делаю?
Ответы
Ответ 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()
});