none
Enviar tipos anónimos a una vista RRS feed

  • Pregunta

  • Hola Amigos 

    Tengo un problema, tengo el siguiente controlador

    namespace RolesMVC3.Areas.Administrador.Controllers
    {
        [Authorize(Roles = "Administrador")]
        public class HomeController : Controller
        {
            private BASEDATOSCJ_2Entities db = new BASEDATOSCJ_2Entities();
            public ActionResult Index()
            {   
                string username = User.Identity.Name;
                MembershipUser user = Membership.GetUser(username);
                Guid key = (Guid)Membership.GetUser().ProviderUserKey;
    
                var Universidades = (from u in db.UNIVERSIDAD
                                     join s in db.SEDE_UNIVERSIDAD on u.IdUniversidad equals s.IdUniversidad
                                     join c in db.CIUDAD_SEDE on s.IdCiudadSede equals c.IdCiudadSede
                                     join co in db.CONSULTORIO on s.IdConsultorio equals co.IdConsultorio
                                     join uxc in db.USUARIOxCONSULTORIO on co.IdConsultorio equals uxc.IdConsultorio
                                     where uxc.UserId == key
                                     select new { u.Nombre, nombreciudad = c.Nombre, s.IdConsultorio}).ToList();
                return View(Universidades);
            }
    
        }
    }
    

    Con este controlador lo que quiero es enviar u.Nombre, nombreciuda y s.IdConsultorio  a  la vista pero no se como hacerlo (de hecho no se si esta bien este controlador), como ven los campos que quiero enviar pertenecen a tablas diferentes. Quiero enviar la consulta como un listado para presentar en la vista, no se viewvag me pueda servir, como hago para pasar estos datos a la vista y mostrarlos con un foreach?. 


    Muchas gracias por su atención, bendiciones


    Saludos

    CADAVID

    jueves, 22 de marzo de 2012 9:22

Respuestas

  • Hola CADAVID,

    Si estás trabajando con Razor en MVC 3, vas a tener problemas con los tipos anónimos en la vista a la hora de bindar valores.

    En este sentido podrías hacer dos cosas:

    1. La primera sería crear un objeto UniverdidadViewModel tipo:

    public class UniversidadViewModel
    {
       public string Nombre { get; set; }
       public string  NombreCiudad { get; set; }
       public int IdConsultorio { get; set; }
    }

    Entonces en el controler te quedaría así:

    // ...
    where uxc.UserId == key
    select new UniversidadViewModel{ u.Nombre, NombreCiudad = c.Nombre, s.IdConsultorio}).ToList();

    Así no tendrías problemas con los tipos anónimos.

    2. La otra posibilidad es usar una función conocida como Expando:

    public static ExpandoObject ToExpando(this object anonymousObject)
    {
        IDictionary<string, object> anonymousDictionary =  new RouteValueDictionary(anonymousObject);
        IDictionary<string, object> expando = new ExpandoObject();
        foreach (var item in anonymousDictionary)
            expando.Add(item);
        return (ExpandoObject)expando;
    }

    Que imita el comportamiento dinámico del ViewBag, pero en tu modelo. En tu controller deberías escribir esto:

    // ...
    where uxc.UserId == key
    select new { u.Nombre, NombreCiudad = c.Nombre, s.IdConsultorio}.ToExpando()).ToList();

    De esta forma, al usar tipos dinámicos, no tendrás problemas en la vista.

    Un saludo,


    Fernanando Escolar - http://www.programandonet.com/ - @fernandoescolar

    • Propuesto como respuesta Pedro Hurtado jueves, 22 de marzo de 2012 16:03
    • Marcado como respuesta CADAVID jueves, 22 de marzo de 2012 16:15
    jueves, 22 de marzo de 2012 9:59

Todas las respuestas

  • Hola CADAVID,

    Si estás trabajando con Razor en MVC 3, vas a tener problemas con los tipos anónimos en la vista a la hora de bindar valores.

    En este sentido podrías hacer dos cosas:

    1. La primera sería crear un objeto UniverdidadViewModel tipo:

    public class UniversidadViewModel
    {
       public string Nombre { get; set; }
       public string  NombreCiudad { get; set; }
       public int IdConsultorio { get; set; }
    }

    Entonces en el controler te quedaría así:

    // ...
    where uxc.UserId == key
    select new UniversidadViewModel{ u.Nombre, NombreCiudad = c.Nombre, s.IdConsultorio}).ToList();

    Así no tendrías problemas con los tipos anónimos.

    2. La otra posibilidad es usar una función conocida como Expando:

    public static ExpandoObject ToExpando(this object anonymousObject)
    {
        IDictionary<string, object> anonymousDictionary =  new RouteValueDictionary(anonymousObject);
        IDictionary<string, object> expando = new ExpandoObject();
        foreach (var item in anonymousDictionary)
            expando.Add(item);
        return (ExpandoObject)expando;
    }

    Que imita el comportamiento dinámico del ViewBag, pero en tu modelo. En tu controller deberías escribir esto:

    // ...
    where uxc.UserId == key
    select new { u.Nombre, NombreCiudad = c.Nombre, s.IdConsultorio}.ToExpando()).ToList();

    De esta forma, al usar tipos dinámicos, no tendrás problemas en la vista.

    Un saludo,


    Fernanando Escolar - http://www.programandonet.com/ - @fernandoescolar

    • Propuesto como respuesta Pedro Hurtado jueves, 22 de marzo de 2012 16:03
    • Marcado como respuesta CADAVID jueves, 22 de marzo de 2012 16:15
    jueves, 22 de marzo de 2012 9:59
  • Gracias amigo hice lo primero que mencionas y voy de lujo, pero me sale un pequeño error me dice en  s.IdConsultorio

     "No se puede convertir implícitamente el tipo 'decimal' en 'int'. Ya existe una conversión explícita (compruebe si le falta una conversión)"    

    Como hago para convertir esto a int?

    Saludos



    CADAVID

    jueves, 22 de marzo de 2012 15:22
  • Hola,

    En el ejemplo te había puesto la propiedad IdConsultorio como entero (dentro de UniversidadViewModel). Pero es posible que de la base de datos lea un decimal. Por esta razón quizá lo mejor sería cambiar el tipo de IdConsultorio:

    public class UniversidadViewModel
    {
       public string Nombre { get; set; }
       public string  NombreCiudad { get; set; }
       public decimal IdConsultorio { get; set; }
    }

    Un saludo,


    Fernanando Escolar - http://www.programandonet.com/ - @fernandoescolar

    jueves, 22 de marzo de 2012 15:26
  • Gracias, pero hay alguna forma de convertirlo a int, lo que pasa es que voy a utilizar este valor mas adelante y lo necesito como int

    Saludos


    CADAVID

    jueves, 22 de marzo de 2012 15:33
  • Hola, 

    Para convertir entre valores numéricos, podemos usar el casting:

    int numeroEntero;
    decimal numeroDecimal;
    
    // ...
    
    numeroEntero = (int)numeroDecimal;

    Un saludo,


    Fernanando Escolar - http://www.programandonet.com/ - @fernandoescolar

    jueves, 22 de marzo de 2012 16:00
  • Gracias amigo

    Benciones


    CADAVID

    jueves, 22 de marzo de 2012 16:15