En mi experiencia recorrindo diferentes lenguajes de programación y sus respectivos frameworks de desarrollo ágil para aplicaciones web, esta vez tocó el turno a asp mvc 2 y para iniciar esperaba crear un lista de selección.. Se que la versión actual de asp mvc es la 3, pero solamente se puede utilizar con visual studio 2010, el cual aun no hemos comprado, por eso este mini how to lo hago con la versión 2.
Leí muchos tutoriales y ejemplos sobre como lograr hacer un dropdownlist con información de un modelo, la mayoría de los ejemplos mostraban lo siguiente:
Crear un modelo y luego una propiedad de tipo List conteniendo SelectListItem que básicamente es una estructura de textos y valores.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class EjemploModel { [DataType(DataType.Text)] [Required(ErrorMessage = "Selecciona un mes")] [DisplayName("Mes")] [UIHint("List")] public List<SelectListItem> meses { get; set; } // Constructor para llenar la lista en la instancia public EjemploModel() { meses= new List<SelectListItem>(); for(int i=1; i<=12; i++) { meses.Add(new SelectListItem() { Value =i.ToString(), Text = i.ToString() }); } } } |
Hasta esta punto todo parece tener sentido.. creando una propiedad de tipo lista y luego pasándola a la vista:
1 2 3 | <%= Html.LabelFor(model => model.mes) %> <%= Html.DropDownListFor(Model.mes, Model.mes, "-------")%> <%= Html.ValidationMessageFor(model => model.mes, "*")%> |
Y seguramente funciona.. el problema venía cuando hacia submit del formulario.. ya que el valor seleccionado del dropdownlist nunca era tomado como parametro en el action donde la enviaba.. Leí muchos post donde a novatos como yo les ocurría el mismo error.. claro, en los tutoriales nunca decían como resolverlo por lo que la respuesta viene a continuación, sencilla para serles sincero..
En los otros frameworks no es necesario definir una propieda de tipo lista, simplemente lo que se hace es definir una propiedad que en este caso sería Int .. y la lista crearla por aparte sin necesidad de hacerla propiedad del modelo. Sé que hay más de una manera de hacer esto y mi forma es la siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class EjemploModel { [DataType(DataType.Text)] [DisplayName("Mes")] [UIHint("List")] public List<SelectListItem> mesLista { get; set; } [DataType(DataType.Text)] [Required(ErrorMessage = "Debe de seleccionar un mes de vencimiento.")] [DisplayName("Mes")] public int mes{ get; set; } // Constructor para llenar la lista en la instancia public EjemploModel() { mesLista= new List<SelectListItem>(); for(int i=1; i<=12; i++) { mesLista.Add(new SelectListItem() { Value =i.ToString(), Text = i.ToString() }); } } } |
Y en la vista quedaría de la siguiente manera:
1 2 3 | <%= Html.LabelFor(model => model.mes) %> <%= Html.DropDownList("mes", new SelectList(Model.mesLista, "Value", "Text"), "-------")%> <%= Html.ValidationMessageFor(model =>; model.mes, "*")%> |
Ahora al momento de hacer submit, el valor seleccionado se pasará hacia la propiedad mes y no a mesLista como ocurría anteriormente. Espero les sirva de ejemplo y guía..
Suerte
Me gusta mucho su forma de explicar, gracias por la ayuda
No hay nada que agradecer Carlos, aprendemos mucho con lo que hacemos y eso transmitimos en este blog.
Saludos