Lista desplegable ASP.NET MVC de SelectList

Estoy construyendo la siguiente SelectList de SelectList en mi controlador.

 var u = new NewUser(); u.UserTypeOptions = new SelectList(new List { new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"}, new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, }); return u; 

Y mostrarlo en mi vista de esta manera:

 @Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions) 

Parece que le estoy dando un conjunto válido de SelectListItem en lo que debería ser una lista desplegable bastante sencilla, pero en lugar de obtener una lista válida de con buenos valores y texto, obtengo esto:

  System.Web.Mvc.SelectListItem System.Web.Mvc.SelectListItem System.Web.Mvc.SelectListItem  

¿Lo que da? Por lo que puedo decir, esto debería funcionar.

Te falta configurar qué campo es el Texto y el Valor en la lista de selección. Es por eso que hace un .ToString() en cada objeto en la lista. Podría pensar que dado que es una lista de SelectListItem debería ser lo suficientemente inteligente como para detectar esto … pero no lo es.

 u.UserTypeOptions = new SelectList( new List { new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"}, new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, }, "Value" , "Text", 1); 

Por cierto, puede usar una lista de matriz de cualquier tipo … y luego simplemente establecer el nombre de las propiedades que actuarán como Texto y Valor.

Creo que es mejor hacerlo así:

 u.UserTypeOptions = new SelectList( new List { new SelectListItem { Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, new SelectListItem { Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, }, "Value" , "Text"); 

Eliminé el elemento -1 y la configuración de cada elemento seleccionado verdadero / falso.

Entonces, en su opinión:

 @Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions, "Select one") 

De esta forma, si configura el elemento “Seleccionar uno” y no establece un elemento como está seleccionado en la lista de selección, el tipo de UserType será nulo (¿el tipo de UserType debe ser int? ).

Si necesita establecer uno de los elementos de la lista de selección como seleccionado, puede usar:

 u.UserTypeOptions = new SelectList(options, "Value" , "Text", userIdToBeSelected); 

Solo prueba esto con una razor de afeitar

 @{ var selectList = new SelectList( new List { new SelectListItem {Text = "Google", Value = "Google"}, new SelectListItem {Text = "Other", Value = "Other"}, }, "Value", "Text"); } 

y entonces

 @Html.DropDownListFor(m => m.YourFieldName, selectList, "Default label", new { @class = "css-class" }) 

o

 @Html.DropDownList("ddlDropDownList", selectList, "Default label", new { @class = "css-class" }) 

Prueba esto, solo un ejemplo:

 u.UserTypeOptions = new SelectList(new[] { new { ID="1", Name="name1" }, new { ID="2", Name="name2" }, new { ID="3", Name="name3" }, }, "ID", "Name", 1); 

O

 u.UserTypeOptions = new SelectList(new List { new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"}, new SelectListItem { Selected = false, Text = "Homeowner", Value = "2"}, new SelectListItem { Selected = false, Text = "Contractor", Value = "3"}, },"Value","Text");