Теперь, когда расширение HtmlHelper принимает IEnumerable<SelectListItem>
, я не создаю SelectList's, а обычно просто создаю SelectListItems с LINQ.
Контроллер
ViewData["CategoryID"] = categories.Select( c => new SelectListItem
{
Text = c.CategoryName,
Value = c.CategoryID
}
);
View
<%= Html.DropDownList("CategoryID") %>
или если я хочу выбор по умолчанию
<%= Html.DropDownList("CategoryID",
(IEnumerable<SelectListItem>)ViewData["CategoryID"],
"Select a Category" ) %>
РЕДАКТИРОВАТЬ :
Интересным моментом в раскрывающемся списке является то, что вам нужно указать диапазон значений, из которых можно выбрать одно значение, которое соответствует вашей фактической модели данных. Я обычно предоставляю диапазон (пункты меню) через просмотр данных и ожидаю возврата значений модели при публикации страницы. Если вам нужны также строго типизированные меню, вам необходимо предоставить модель только для просмотра, которая инкапсулирует вашу реальную модель и любые меню. Это будет включать в себя при публикации использование префиксов для идентификации элементов модели. На мой взгляд, компромисс - более простая привязка модели к посту, чем использование строго типизированных меню в представлении. Я не зациклен на последнем, поэтому я предпочитаю не помещать свои меню в модель. Если вы хотите сделать это, это может выглядеть следующим образом.
Модель
public class CategoryViewModel
{
public Category Category { get; set; }
public IEnumerable<SelectListItem> CategoryMenu { get; set; }
...
}
Контроллер
Действие дисплея
var model = new CategoryViewModel();
model.CategoryMenu = categories.Select( c => new SelectListItem
{
Text = c.CategoryName,
Value = c.CategoryID
}
);
...
return View(model);
Создать действие
[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Create( [Bind(Prefix="Category")]Category category )
{
...
}
View
<%= Html.TextBox("Category.Name") %>
<%= Html.DropDownList("Category.CategoryID",
Model.CategoryMenu,
"Select a Category" ) %>