Introducción
Este articulo propone una versión diferente a la planteada en el anterior
[ASP.NET MVC] Carga DropDownList dependientes
En este caso definiremos un único action para recibir la selección que realice el usuario.
La funcionalidad de la pantalla se conserva idéntico al articulo anterior, al igual que el modelo de datos.
Modelo de Vista
Para el modelo se define una clase que recibirá las propiedades con la selección del usuario, además de propiedades que permitirán cargar los controles de listas en la view
Definición de la View
La vista esta formada por un solo Form, el cual realiza el post al action Index() el cual se encuantra marcado con el atributo [HttpPost]
Tanto si se selecciona un ítem combo, o se presiona el botón del submit (el cual selecciona los empleados) todas las acciones invocan al único action
A diferencia del articulo anterior ya no se requieren de hidden para conservar la selección de la acción anterior.
Definición del action
El action implementar bastante mas lógica que la usada en el articulo anterior, ya que deberá determinar que propiedades vienen con datos y cargar las listas en consecuencia.
[HttpPost] public ActionResult Index(EmployeeModel model) { //se carga la lista de regiones var regionList = regionRepository.GetAll(); List<Territory> territoryList = null; List<Employee> employeeList = null; //si hay una region seleccionada if (model.RegionId != null) { //se carga la lista de territorios territoryList = territoryRepository.Filter(x => x.RegionID == model.RegionId); //si hay un territorio seleccionado if (!string.IsNullOrEmpty(model.TerritoryId)) { //se recupera el territorio, para poder obtener los empleados asociados employeeList = territoryRepository.GetEmployees(model.TerritoryId); } } model.RegionList = new SelectList(regionList, "RegionID", "Description"); if (territoryList != null && territoryList.Count > 0) { model.TerritoryList = new SelectList(territoryList, "TerritoryID", "Description"); } if (employeeList != null && employeeList.Count > 0) { model.EmployeeList = new SelectList(employeeList, "EmployeeID", "FullName"); } return View("Index", model); }
Si se selecciona una región se recibirá el valor en el parámetro del modelo
Si luego se selecciona un territorio
Y al marcar empleados sobre el listbox y presionar el botón de submit se carga la lista
En cada invocación al acción será necesario volver a cargar las listas del model utilizadas para definir los ítems de los controles la la view, ya que estas no participan en el proceso de binding donde son asignados los valores que se envían en al post a las propiedades del parámetro del action.
Model Binding
Para entender como se produce la asignación de la selección de los controles con las propiedades del modelo es necesario evaluar el html
Si las propiedades “name” de los controles que se renderizan en el html coinciden con los nombres de las propiedades de la clase definida como modelo la asignación del valor es automáticamente.
si algún control no llegara a tener esta coincidencia se puede redefinir el name utilizando
Código
[C#]
|