2009-04-25 37 views

Respuesta

9

Ahora que la extensión HtmlHelper toma un IEnumerable<SelectListItem>, no creo listas de selección, pero generalmente solo creo los artículos de lista de selección con LINQ.

controlador

ViewData["CategoryID"] = categories.Select(c => new SelectListItem 
               { 
                Text = c.CategoryName, 
                Value = c.CategoryID 
               } 
             ); 

Ver

<%= Html.DropDownList("CategoryID") %> 

o si quiero una selección predeterminada

<%= Html.DropDownList("CategoryID", 
         (IEnumerable<SelectListItem>)ViewData["CategoryID"], 
         "Select a Category") %> 

EDITAR:

El aspecto interesante de la lista desplegable es que debe proporcionar un rango de valores para seleccionar un solo valor que se ajuste a su modelo de datos real. Por lo general, proporciono el rango (elementos de menú) a través de datos de vista y espero recuperar los valores del modelo cuando se publica la página. Si también deseaba menús fuertemente tipados, debería proporcionar un modelo de solo vista que encapsula su modelo real y cualquier menú. Esto implicaría, al publicar, el uso de prefijos para identificar los elementos del modelo. El intercambio, en mi opinión, es un enlace de modelo más simple en la publicación frente a la utilización de menús fuertemente tipados en la vista. No me cuelgo de esto último, así que opto por no poner mis menús en el modelo. Sin embargo, si quisiera hacer esto, podría parecerse a lo siguiente.

Modelo

public class CategoryViewModel 
{ 
    public Category Category { get; set; } 
    public IEnumerable<SelectListItem> CategoryMenu { get; set; } 
    ... 
} 

controlador

acción Visualización

var model = new CategoryViewModel(); 
model.CategoryMenu = categories.Select(c => new SelectListItem 
               { 
                Text = c.CategoryName, 
                Value = c.CategoryID 
               } 
            ); 

... 
return View(model); 

Crear acción

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Prefix="Category")]Category category) 
{ 
    ... 
} 

Ver

<%= Html.TextBox("Category.Name") %> 

<%= Html.DropDownList("Category.CategoryID", 
         Model.CategoryMenu, 
         "Select a Category") %> 
+0

Eso es genial. Podría proporcionar un ejemplo usando esto con el patrón ViewModel. Gracias – Danny

5

Aquí hay un gran artículo de Rob Connery

Código controlador

NorthwindDataContext db = new NorthwindDataContext(); 
var categories = from c in db.Categories select c; 
ViewData["CategoryID"] = new SelectList(categories, "CategoryID", "CategoryName"); 

vista Marcas

<%=Html.DropDownList("CategoryID")%> 
+1

No necesita el segundo argumento en html helper. El método lo buscará si acaba de pasar el "ID de categoría". –

+0

@cagdas, Good obsevation +1 –

0

Si es necesario agregar atributos HTML a las etiquetas de esto sería una manera de hacerlo. Pase un modelo a su punto de vista e.i."Regresar ver (someModel)" y luego en la vista:

 <select id="Groups" name="Groups"> 
      <% foreach (SelectListItem item in Model.GroupsDropDown) 
       { 
        if (item.Selected) 
        {%> 
         <option selected="selected" title="<%= item.Text %>"> 
          <%= item.Text%></option> 
        <%} 
        else 
        {%> 
         <option title="<%= item.Text %>"> 
          <%= item.Text%></option> 
        <%} %> 
      <% } %> 
     </select> 

GroupsDropDown es una propiedad en su modelo como este:

pública IEnumerable GroupsDropDown {get; conjunto; }

0

Escribir en la vista:

@{ 
TaskManagerContext context = new TaskManagerContext(); 

IEnumerable<TestTask1.Models.User> CDrop = context.Users.ToList(); 
List<SelectListItem> selectList = new List<SelectListItem>(); 
foreach (var c in CDrop) 
{ 
    SelectListItem i = new SelectListItem(); 
    i.Text = c.Username.ToString(); 
    i.Value = c.ID.ToString(); 
    selectList.Add(i); 
} 

}

puede hacer referencia a que Ike que:

@Html.DropDownListFor(m => m.UserID, 
          new SelectList(selectList, "Value", "Text")); 

También puede optar por una fila específica:

TaskManagerContext context = new TaskManagerContext(); 
UsersRepository repo = new UsersRepository(); 
User user = repo.GetAll().FirstOrDefault(u => u.ID == ViewBag.UserId); 
ViewBag.User = user; 

<div><h3><label>@ViewBag.Title1</label>@ViewBag.User.Username</h3></div> 
Cuestiones relacionadas