Now that the HtmlHelper extension accepts IEnumerable<SelectListItem> , I do not create a SelectList, but usually just create a SelectListItems with LINQ.
controller
ViewData["CategoryID"] = categories.Select( c => new SelectListItem { Text = c.CategoryName, Value = c.CategoryID } );
View
<%= Html.DropDownList("CategoryID") %>
or if I need a default choice
<%= Html.DropDownList("CategoryID", (IEnumerable<SelectListItem>)ViewData["CategoryID"], "Select a Category" ) %>
EDIT :
An interesting bit about the drop-down list is that you need to provide a series of values ββfrom which you can select a single value that matches your actual data model. I usually provide a range (menu items) through the view data and expect the model values ββto return when this page is published. If you need strictly typed menus, you need to provide a view-only model that will encapsulate your real model and any menus. This assumes, upon publication, the use of prefixes to identify model elements. The trade-off, in my opinion, is a simpler binding of the model to the message against the use of strongly typed menus in the view. I did not hang up on the latter, so I decided not to put my menus in the model. If you want to do this, it might look like this.
Model
public class CategoryViewModel { public Category Category { get; set; } public IEnumerable<SelectListItem> CategoryMenu { get; set; } ... }
controller
Display action
var model = new CategoryViewModel(); model.CategoryMenu = categories.Select( c => new SelectListItem { Text = c.CategoryName, Value = c.CategoryID } ); ... return View(model);
Create action
[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" ) %>
tvanfosson
source share