none
Mostrar elemento seleccionado de una tabla en un dropdownlist RRS feed

  • Pregunta

  • Buenas tardes tengan todos ustedes,

    Me acerco nuevamente a este foro, para solicitar su ayuda. Mi problema es el siguiente tengo una tabla que tiene dos botones uno editar y eliminar. Al darle en el boton editar me sale un popup con los datos de esa fila en los textbox, sin embargo tengo un dropdownlist en ese popup pero el problema es que no me muestra el elemento que selecciono al darle clik al boton. 

    Les dejo una imagen para referenciaComo se puede ver los datos aparecen bien en los texbox pero no asi en el dropdwonlist, siempre me sale la primera opcion  "Seleccione". Como puedo hacer para que me tome el dropdownlist el elemento seleccionado.

    Les comparto el codigo que tengo para que me puedan orientar, esto es lo que tengo en mi contralador :

    public ActionResult Agregar_Editar(int id = 0)
            {
                ViewModel vm = new ViewModel();
                Operaciones op = new Operaciones();

                if (id == 0)
                {
                    vm.DepartamentosCombo = op.MostrarDepartamentos();
                    return View(vm);
                }
                else
                {
                    using (TigerEntities db = new TigerEntities())
                    {
                        vm.DepartamentosCombo = op.MostrarDepartamentos();--Esta linea llena el drop con todos los elementos
                        vm.Empleado = db.Empleadoss.Where(x => x.EmpleadoID == id).FirstOrDefault(); --Con esta linea se llenan los textbox pero no el dropdownlist con el elemento seleccionado
                        
                        return View(vm);
                    }
                }
            }

    Y en la vista tengo esto: 

     @Html.DropDownListFor(m => m.IDDepartamento, new SelectList(Model.DepartamentosCombo, "Id_Departamento", "Nombre_Departamento"), new { @class = "form-control" })

    Alguna idea de lo que me pueda faltar? Les agradezco mucho su aportacion.


    Carlos David Frias

    viernes, 23 de febrero de 2018 19:10

Respuestas

  • Pero ahora que leo bien su código, veo que el ViewModel tiene una propiedad Empleado.  Sin embargo, en la vista usted tiene m => m.IDDepartamento.  No veo en el código de su método nada que vincule la propiedad IDDepartamento con la información en en la propiedad Empleado.  Parece que este sería el error:  IDDepartamento nunca obtiene un valor asignado.  Siempre es cero.


    Jose R. MCP
    Code Samples

    lunes, 26 de febrero de 2018 17:51

Todas las respuestas

  • Luce bien.  ¿Ya se aseguró de que el valor de m.IDDepartamento tenga opción en DepartamentosCombo?  ¿Ya revisó el HTML generado?  ¿Hay alguna opción en el HTML que diga "selected"?

    Jose R. MCP
    Code Samples

    sábado, 24 de febrero de 2018 6:00
  • Que tal Jose,

    Efectivamente la propiedad IDDepartamento no esta dentro de la de DepartamentosCombo, ya que es un storedprocedure que se mapeo, y todos los procedimientos mapeados y tablas están dentro de un ViewModel

    public class ViewModel
        {
            public List<GetDepartamentos_Result> DepartamentoCombo { get; set; }//Prodecimiento para el combo
            public List<GetEmpleados_Result> EmpleadosGrid { get; set; }// Procedimiento para grid
            public Empleadosss Empleados { get; set; }//Tabla mapeada de Empleados

             public int IDDepartamento{ get; set; } //Propiedad que agregue para obtener el ID DEL DEPARTAMENTO

        }

    La clase que se genera de DepartamentoCombo es:

    public partial class GetDepartamentos_Result
        {
            public int Id_Departamento { get; set; }
            public string Nombre_Descripcion { get; set; }
        }

    asi es como tengo las clases, alguna sugerencia que me pudiera ayudar?


    Carlos David Frias

    sábado, 24 de febrero de 2018 14:49
  • Cero que no me ha entendido.  Durante la ejecución, DropDownListFor() genera código HTML que es transmitido al cliente.  Ese código HTML conlleva una serie de elementos <option>.  Cada uno de estos elementos tiene un atributo value, y si el valor de m.IDDepartamento coincide con el valor del atributo value de algún elemento <option>, entonces ese elemento también tendrá el atributo selected.

    La tarea que le encomiendo ahora es:  Revise el HTML generado en su aplicación.  Ubique estos elementos <option>.  Luego verifique que los valores de los atributos value sean los esperados y ubique el elemento <option> que tiene el atributo selected.  Mi sospecha es que no habrá ninguno con selected.  Mi sospecha es que el valor de m.IDDepartamento no se encuentra en la lista de elementos <option>.  Si es así, su solución es asegurarse de que el elemento <option> correcto aparezca listado.


    Jose R. MCP
    Code Samples

    sábado, 24 de febrero de 2018 19:14
  • Hola nuevamente Jose,

    He ejecutado mi aplicación y revisando el codido HTML el elemento que tiene el atributo selected es el primero, no es el que yo quiero que sea. Sigo sin comprender por que el dropdownlist no me toma el elemento que selecciono en la tabla. Para mayor referencia del HTML generado dejo la siguiente imagen.

    Al darle boton editar en la tabla me lanza el popup, pero en el dropdownlist me sigue apareciendo el primer elemento que es "Seleccione" y debería aparecer "Sistemas" que es el primer registro que seleccione en la tabla. Obviamente me aparece el primer elemento por que en el HTML el elemento <option> atributo selected es el primero. No se como hacer para que quede seleccionado el elemento correcto.


    Carlos David Frias

    lunes, 26 de febrero de 2018 17:41
  • hola

    la idea es que cuando editas usando este tipo de popup debes usar ajax

    [ASP.NET] PopUp Edición - Usando Jquery UI Dialog

    entonces lanzas el popup con el template de edicion y utilzando $.ajax cargas los datos y los combos, asignando tu mismo que valor debe seleccionar

    analiza el ejemplo, alli lo explico

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 26 de febrero de 2018 17:45
  • Pero ahora que leo bien su código, veo que el ViewModel tiene una propiedad Empleado.  Sin embargo, en la vista usted tiene m => m.IDDepartamento.  No veo en el código de su método nada que vincule la propiedad IDDepartamento con la información en en la propiedad Empleado.  Parece que este sería el error:  IDDepartamento nunca obtiene un valor asignado.  Siempre es cero.


    Jose R. MCP
    Code Samples

    lunes, 26 de febrero de 2018 17:51
  • Muchas gracias Jose por responder, al parecer ese es el error, sin embargo no se como vincular la propiedad IDDepartamento con la información de Empleado.

    El ViewModel

     public class ViewModel
        {
            public List<GetDepartamentos_Result> DepartamentosCombo { get; set; }
            public List<spSeleccionar2_Result> EmpleadosGrid { get; set; }
            public Empleadoss Empleado { get; set; }

            [DisplayName("Departamento")]
            public int IDDepartamento { get; set; } //Esta es la propiedad que yo agregue al ViewModel 
        }

    La clase Empleadoss de

    public partial class Empleadoss
        {
            public int EmpleadoID { get; set; }
            public string Nombre { get; set; }
            public string Posicion { get; set; }
            public string Office { get; set; }
            public Nullable<int> Edad { get; set; }
            public Nullable<int> Salario { get; set; }
            public Nullable<int> DepartamentoID { get; set; }
        }

    Método de accion

    public ActionResult Agregar_Editar(int id = 0)
            {
                ViewModel vm = new ViewModel();
                Operaciones op = new Operaciones();

                if (id == 0)
                {
                    vm.DepartamentosCombo = op.MostrarDepartamentos();
                    return View(vm);
                }
                else
                {
                    using (TigerEntities db = new TigerEntities())
                    {
                        vm.DepartamentosCombo = op.MostrarDepartamentos();
                        vm.Empleado = db.Empleadoss.Where(x => x.EmpleadoID == id).FirstOrDefault();
                        
                        return View(vm);
                    }
                }
            }

    En mi método de acción como puedo asociar la propiedad IDDepartamento con la clase Empleadoss. Realmente me siento perdido en este punto.


    Carlos David Frias

    lunes, 26 de febrero de 2018 18:23
  • Gracias Leandro, 

    Analizare el ejemplo que mencionas, sin embargo no ocupo Ajax, para cargar los textbox ocupo esto:

    vm.Empleado = db.Empleadoss.Where(x => x.EmpleadoID == id).FirstOrDefault();

    Aqui solo me carga los texbox pero no el combo.



    Carlos David Frias

    lunes, 26 de febrero de 2018 18:26
  • Jose, he logrado hacer que funcione con lo que me comento. Efectivamente IDDepartamento  no esta relacionado con Empleadoss, cambie el dropdwonlist a esto:

    <div class="form-group">
            @Html.LabelFor(m => m.Empleado.DepartamentoID, new { @class = "control-label" })
            @Html.DropDownListFor(m => m.Empleado.DepartamentoID, new SelectList(Model.DepartamentosCombo, "Id_Departamento", "Nombre_Departamento"), new { @class = "form-control" })
        </div>

    Y funciono de maravilla.

    Le agradezco muchísimo su ayuda y su tiempo.!!


    Carlos David Frias

    lunes, 26 de febrero de 2018 18:38