5

En mi MVC 3 Razor aplicación, tengo un modelo con una enumeración ..Cómo utilizar MVC HTML ayudante .DropDownListFor <> con una enumeración

Modelo Ejemplo:

public class EmployeeModel 
{ 
public enum Title 
{ 
    Accountant = 111, 
    Sales = 222, 
    Production = 333 
} 

[Required] 
public string Name {get; set;} 

[Required] 
public Title JobTitle {get; set;} 
} 

en mi opinión me le gustaría utilizar los ayudantes HTML para crear un formulario HTML ...

Ver Ejemplo:

@model ..Models.EmployeeModel 

@using (Html.BeginForm()) 
{ 
@Html.LabelFor(m => m.Name) 
@Html.TextBoxFor(m => m.Name) 
<br> 

@Html.LabelFor(m => m.JobTitle) 
@Html.DropDownListFor(m => m.JobTitle, ??How do I get Title enum values??) 
<br> 

<input type="submit /> 
} 

la salida del desplegable ListFor que tratar de alcanzar se vería así: Tenga en cuenta los valores de las opciones coinciden con los valores inicializados de la enumeración

<select name="JobTitle"> 
<option value="-1">Choose a Job Title</option> 
<option value="111">Accountant</option> 
<option value="222">Sales</option> 
<option value="333">Production</option> 
</select> 

¿Cómo consigo el DropDownListFor <> ayudante para crear un elemento select/opción basada en el título enum del modelo?

Además, es posible tener la DropDownListFor <> ayudante para añadir un extra (que no es parte de la enumeración) similar a la opción "Elegir un puesto de trabajo" en el ejemplo anterior?

+0

posible duplicado de [MVC3 Razor DropDownListFor enumeraciones] (http://stackoverflow.com/questions/4656758/mvc3 -razor-dropdownlistfor-enums) – Jed

Respuesta

3

Posiblemente podría obtener un String[] con los nombres de los valores enum y crear un menú desplegable a partir de eso. En su modelo de vista, agregue una propiedad Titles del tipo SelectListItem y agregue los valores enum y los nombres a eso. Puede obtener los nombres y valores a través del tipo System.Enum.

var defaultItem = new SelectListItem(); 
defaultItem.Value = -1; 
defaultItem.Text = "Choose a title"; 
defaultItem.Selected = true; 
model.TitleSelectItems.add(defaultItem); 

String[] names = System.Enum.GetNames(typeof(Title)); 
Int[] values = System.Enum.GetValues(typeof(Title)); 

for (int i = 0; i<names.Length; i++) 
{ 
    var item = new SelectListItem(); 
    item.Text = names[i]; 
    item.Value = values[i]; 
    model.TitleSelectItems.Add(item); 
} 

Es un poco feo, pero que va a trabajar.

2

Aquí está una manera el uso de HTML Ayudantes:

Modelo

public class Person 
{ 
    public string Name { get; set; } 
    public JobTitle Job { get; set; } 
    public enum JobTitle 
    { 
     Accountant = 111, 
     Sales = 222, 
     Production = 333 
    } 
} 

Ver

@model MvcApplication1.Models.Person 

@{ 
    ViewBag.Title = "Index"; 
} 

@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(n => n.Name) 
    @Html.DropDownListFor(c => c.Job, new[]{ 
     new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Accountant.ToString(), 
      Value=((int)MvcApplication1.Models.Person.JobTitle.Accountant).ToString()} 
     ,new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Production.ToString(), 
      Value=((int)MvcApplication1.Models.Person.JobTitle.Production).ToString()} 
     ,new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Sales.ToString(), 
      Value=((int)MvcApplication1.Models.Person.JobTitle.Sales).ToString()}} 
      , "Choose a Job Title")        
} 

salida HTML

<!DOCTYPE html> 
<html> 
<head> 
    <title>Index</title> 
</head> 
<body> 
<form action="/" method="post"> 
<input id="Name" name="Name" type="text" value="" /> 
<select id="Job" name="Job"> 
<option value="">Choose a Job Title</option> 
<option value="111">Accountant</option> 
<option value="333">Production</option> 
<option value="222">Sales</option> 
</select> 
</form> 
</body> 
</html> 
3

Me tropecé en este StackO question/answer - no sólo es mi pregunta aquí un duplicado exacto, pero el answer given by Mike McLaughlin es la mejor solución que he visto para el uso DropdownListFor<> con Enums. En concreto, Mike nos señala a a solution that he found by Morgan Leroi

solución rápida de Morgan es:

@Html.DropDownListFor(model => model.State, new SelectList(Enum.GetValues(typeof(MyNamespace.Enums.States)))) 

Pero, Morgan ha hecho una extensión que hace que la implementación de la DropDownListFor<> con enumeraciones aún más compacto. Puede download Morgan's Visual Studio Solution here.

Dicho esto, creo que debemos cerrar esta pregunta, ya que es un duplicado exacto.

+1

¿Qué pasa con el elemento predeterminado? – r03

0

Lo resuelto con esta extensión:

public static SelectList ToSelectListWithDefault<TEnum>(this TEnum enumObj, string defValue, string defText) where TEnum : IConvertible 
{ 
    var values = new List<SelectListItem>(); 
    var defItem = new SelectListItem() { Value = defValue, Text = defText }; 
    values.Add(defItem); 
    foreach (TEnum e in Enum.GetValues(typeof(TEnum))) 
    { 
     values.Add(new SelectListItem() { Value = e.ToInt16(null).ToString(), Text = e.ToString() }); 
    } 

    return new SelectList(values, "Value", "Text", defItem); 
} 

(me encontré con la extensión de SO, pero sin el valor por defecto)

2

Un encapsulado HTML ayudante de extensión está disponible aquí:

http://www.spicelogic.com/Journal/ASP-NET-MVC-DropDownListFor-Html-Helper-Enum-5

la instantánea del código fuente:

enter image description here

Puede descargar el código fuente completo del proyecto desde el enlace.

+1

Respondí a esta pregunta también: http://stackoverflow.com/questions/388483/how-do-you-create-a-dropdownlist-from-an-enum-in-asp-net-mvc/16089319#16089319 –

3

Aquí está la solución

public enum Months 
{ 
January=1, 
February=2, 
March=3, 
April =4, 
May=5, 
June=6 
} 

public ActionResult Index() 
{ 

ViewBag.Months = (from Months m in Enum.GetValues(typeof(Months)) 
       select new SelectListItem { Text = m.ToString(), Value = Convert.ToUInt16(m).ToString() }); 

return View(); 
} 

Añadir nombre ViewBag en DropDownList:

<%=Html.DropDownList("Months") %> 
Cuestiones relacionadas