none
Modelo con múltiples modelos RRS feed

  • Debate general

  • Buenas tardes

    Agradezco un poco de su ayuda. poseo un formulario que contiene 5 dropdownList  en un proyecto MVC con C#.

    los desplegables son: Genero, Estado civil, Departamento, Ciudad y Zona

    Genero: M, F (se llena la lista de forma manual tipo string)

    Estado civil : Casado, soltero, viudo, etc. (Se llena de forma manual tipo string)

    Departamento: Departamentos de colombia (Se llena desde una tabla SQL Server)

    Municipios: Municipios de Colombia (Se llena de acuerdo al departamento seleccionado, cascade, Tabla SQL Server)

    Zona: R, U ( Se llena de forma manual tipo string)

    Esos campos se cargar con el valor por defecto de acuerdo a la informacion que contenga el modelo Cliente (Tabla SQL Server) y permitir que se puedan cambiar si se desea realizar algunos cambios.

    Como puedo enviar todas estas listas y clases en un solo modelo para poder manejar la información en una vista ?

    poseo una clase que llamé general en donde lleno las listas, en el ActionResult cargo esas listas a una variables, pero al momento de enviarlas no me permiten en la vista seleccionar que de objeto extraer la información.


    Agradezco su ayuda.

    public class General
        {

            //Variables
            DBEntities db = new DBEntities();

            //Lista de géneros
            public List<string> ListGenero()
            {
                List<string> generos = new List<string>();
                generos.Add("M");
                generos.Add("F");
                return generos;
            }

            //Lista de estado civil
            public List<string> ListEstados()
            {
                List<string> estados = new List<string>();
                estados.Add("SOLTERO");
                estados.Add("CASADO");
                estados.Add("DIVORCIADO");
                estados.Add("VIUDO");
                estados.Add("UNIÓN LIBRE");
                return estados;
            }

            //Lista de departamentos 
            public List<Departamento> ListDpto()
            {
                List<Departamento> Dptos = db.Departamento.ToList();
                return Dptos;
            }

            //Lista de municipios
            public List<Municipio> ListMnco(int code)
            {
                List<Municipio> Mncos = db.Municipio.Where(m => m.Cod_Dep == code).ToList();
                return Mncos;
            }
        }

    ///////////////////////////////////////////////////////////

        public class Cliente_info
        {
            public Cliente cliente { set; get; }
            public List<string> genero {get; set;}
            public List<string> estados { get; set; }
            public List<Departamento> departamentos  {get; set;}
        }

    /////////////////////////////////////////////////////////

            public ActionResult Detalles(string id)
            {
                Cliente_info ci = new Cliente_info();

                if (id == null)
                {
                    return RedirectToAction("Index");
                }

                Cliente cte = db.Cliente.Find(id);
                List<string> gnr = general.ListGenero();
                List<string> est = general.ListEstados();
                List<Departamento> dptos = general.ListDpto();

                ci.paciente = cte;
                ci.genero = gnr;
                ci.estados = est;
                ci.departamentos = dptos;
                
                return View(ci);
            }




    • Editado IFRiD viernes, 3 de abril de 2020 21:48
    viernes, 3 de abril de 2020 21:40

Todas las respuestas

  • hola

    Podrias recibirlo en una clase model en donde la propiedad coincida con el name de control html

    [ASP.NET MVC] Carga DropDownList dependientes

    en el articulo lo explico

    veras como en el model no solo defines la propiedad de la lista, sino que debes agregar la propiedad individual que recibira el valor en el post

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 3 de abril de 2020 22:54
  • Que tal amigo buenas tardes

    espero haber entendido tu pregunta la cuestión aquí es que no indicas cual es el modelo de cliente sin embargo, para enviar toda la información en un solo modelo to haría lo siguiente.

    1.  Crear un ViewModel  que herede de Cliente

    2.- agregar las listas de acuerdo a tu petición.

     el código quedaría mas o menos así.

    suponiendo que tu modelo cliente sea

     public class Cliente
        {      
    public int clienteId {get;set;}
    public string nombre {get;set;}
        }

    el viewModelCliente quedaria mas o menos asi.

     public class ViewMtoCliente : Cliente
        {
          
            public List<MtoInvestigacionOcupa> _ListMercadosOcupa { get; set; }
            public List<MtoZona> _ListZonas { get; set; }
            public List<MtoCronograma> _ListCronograma { get; set; }
        }

    Saludos.


    Horacio Xochitemol Bautista

    domingo, 5 de abril de 2020 17:29
  • Buenas noches Horacio, logré incluir todo en un solo modelo como dices y logré cargar las listas, sin embargo el cliente trae ya unos valores cargados para esas listas y al momento se dar el valor por defecto no es posible, es decir se logran ver los datos pero no el que ya figura en la base de datos de ese ciente para ello hice las siguientes modificaciones en la clase de las listas a ejemplo del estado civil:

            //llenar la lista de estado civil
            public List<Estados> ListEstados()
            {

              List<Estados> estados = new List<Estados>();
               estados.Add(new Enables() { Id = 1, Estado = "SOLTERO" });
               estados.Add(new Enables() { Id = 2, Estado = "CASADO" });
               estados.Add(new Enables() { Id = 3, Estado = "VIUDO" });
               estados.Add(new Enables() { Id = 4, Estado = "DIVORCIADO" });
               estados.Add(new Enables() { Id = 5, Estado = "UNION LIBRE });
                return estados;
            }

           //Clase de estados

           pubic class Estados

           {

                 public int Id {get; set;}

                 public string Estado {get; set

           }      

          //Clase para la vista

          public class Cliente_Info

         {

               public Cliente cliente {get; set;}

                public SelectList ListEstados {get; set;}

          }

          //Controlador  a ejemplo el cliente 1

          public ActionResult Index()

         {

          MyEntity db= new MyEntity();

          Cliente_Info cliente_info= new Clinte_info();

          Cliente clte= db.Cliente.Find(1);

          cliente_info.cliente= clte;

          cliente_info.ListEstados= new SelectList(ListEstados(), "Id", "Estado", clte.Estado); //Aquí el estado                  es casado=2

           return View(cliente_info)

          }

         // En el View

         @model MyModelo.Models.Cliente_Info

         Toda la información del cliente se carga incluso los list pero el valor por defecto que quería que apareciera "CASADO" en este ejemplo, no sale, la línea de código en el View es la siguiente:

         @Html.DropDownListFor(model => model.cliente.Estado, model.ListEstados, "-- Seleccione --", new { @class = "form-control form-control-sm" })

    Podrías ayudarme, me aparecen las opciones pero no el valor por defecto que a este ejemplo debería cargar ya con la opción de "CASADO"



    • Editado IFRiD viernes, 10 de abril de 2020 1:33
    viernes, 10 de abril de 2020 1:24
  • Muchas gracias, el sistema de DropDown en casacada funciona sin ningún problema, sin embargo para clientes que ya tienen información definida no me es posible dar un valor por default tanto en este tipo como en el os DropDown independientes. Agradezco su ayuda
    viernes, 10 de abril de 2020 1:28
  • Muchas gracias Horacio, agradezco pueda ayudarme en la situación que presento a continuación
    viernes, 10 de abril de 2020 1:29
  • que tal amigo.

    ok entiendo que esa situación se da cuando quieres editar un cliente, bueno lo que necesitas aqui es pasar el valor almacenado en la base de datos, y cargarlo en la vista, te voy a poner ejemplo de como lo hago, igual hay mil formas pero esta me funciona a mi.

     en el metodo editar

    public ActionResult Edit(int? id) { var user = db.MtoUsuarios.Where(u => u.UserName == User.Identity.Name).FirstOrDefault(); if (user == null) { RedirectToAction("Index", "Home"); } if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var procedimiento = db.MtoProcedimientos.Find(id); if (procedimiento == null) { return HttpNotFound(); } var p = ToViewMtoProcedimiento(procedimiento); return View(p); }


    ahora antes de volver el model a la vista hice un metodo apra convertir el modelo en la view model, cargando los datos de las tablas y los campos seleccionados.

    private ViewMtoProcedimiento ToViewMtoProcedimiento(MtoProcedimiento view)
            {
    
    
                return new ViewMtoProcedimiento
                {
                    MtoProcedimientoId = view.MtoProcedimientoId,
                    Ejercicio = view.Ejercicio,
                    FechaRecepcion = view.FechaRecepcion,
                    OficioPeticion = view.OficioPeticion,
                    NoLicitacion = view.NoLicitacion,
                    Fundamento = view.Fundamento,
                    Descripcion = view.Descripcion,
                    PreConvocatoria = view.PreConvocatoria,
                    Convocatoria = view.Convocatoria,
                    JtaAclaracion = view.JtaAclaracion,
                    AperturaOfertas = view.AperturaOfertas,
                    Fallo = view.Fallo,
                    Contratos = view.Contratos,
                    Observaciones = view.Observaciones,
                    MtoCompaniaId = view.MtoCompaniaId,
                    MtoUsuarioId = view.MtoUsuarioId,
                    MtoTipoCompraId = view.MtoTipoCompraId,
                    MtoTipoEventoId = view.MtoTipoEventoId,
                    MtoTipoMercadoId = view.MtoTipoMercadoId,
                    MtoEstadoId = (view.MtoEstadoId != 0) ? view.MtoEstadoId : ComboHelper.GetStatus("Activo", db),
                    OficioInvMerc = view.OficioInvMerc,
                    NumeroInvestigacion = view.NumeroInvestigacion,
                    FechaOficioInv = view.FechaOficioInv,
                    ConvocatoriaDof = view.ConvocatoriaDof,
                    MtoCaracterId = view.MtoCaracterId,
                    MtoArticuloId = view.MtoArticuloId,
                    DetalleArticuloId = view.DetalleArticuloId,
    
    
                    _ListMtoTipoCompras = new SelectList(ComboHelper.GetTipoCompra(view.MtoCompaniaId), "MtoTipoCompraId", "Descripcion"),
                    _ListMtoTipoEventos = new SelectList(ComboHelper.GetTipoEvento(view.MtoCompaniaId), "MtoTipoEventoId", "Descripcion"),
                    _ListMtoTipoMercados = new SelectList(ComboHelper.GetTipoMercado(view.MtoCompaniaId), "MtoTipoMercadoId", "Descripcion"),
                    _ListMtoCaracteres = new SelectList(ComboHelper.GetTipoCaracter(view.MtoCompaniaId), "MtoCaracterId", "Descripcion"),
                    _ListMtoArticulos = new SelectList(ComboHelper.GetArticulos(view.MtoCompaniaId), "MtoArticuloId", "Descripcion"),
                    _ListDetalleArticulos = new SelectList(ComboHelper.GetFracciones(0), "DetalleArticuloId", "Descripcion"),
    
                    _ListCronograma = db.MtoCronograma.Where(c => c.MtoProcedimientoId == view.MtoProcedimientoId).ToList(),
    
    
                    _ListMercadosOcupa = db.MtoInvestigacionOcupa
                                                 .Where(m => m.MtoProcedimientoId == view.MtoProcedimientoId)
                                                .ToList(),
    
                    _ListZonas = db.MtoZonas
                                    .Where(m => m.MtoProcedimientoId == view.MtoProcedimientoId)
                                    .ToList(),
                };
            }

    Con este cogido cargo los combos

    public static List<MtoTipoCompra>GetTipoCompra(int? Id)
            {
    
                var tipocompra = db.MtoTipoCompras.ToList();
    
                if (Id !=0)
                {
                    tipocompra = db.MtoTipoCompras.Where(c => c.MtoTipoCompraId != Id).ToList();
                }
    
                tipocompra.Add(new MtoTipoCompra
                {
                    //MtoCompaniaId = 0,
                    MtoTipoCompraId = 0,
                    Descripcion = "[Selecciona Tipo de Compra]"
                });
                return tipocompra.OrderBy(p => p.Descripcion).ToList();
            }

    Como recomendación, te aconsejo que los datos de Municipio, Estado, y Generos, los metas en una base de datos, ya que si cambias posteriormente esa lista tendrias ue modificar las codigo para agregar los nuevos registros.

    Saludos.


    Horacio Xochitemol Bautista

    domingo, 12 de abril de 2020 14:34