none
Es buena práctica utilizar lógica en un ViewModel? RRS feed

  • Pregunta

  • Hola, estoy trabajando con una vista que recibe 2 entidades, una es de mascotas y otra de imágenes, entonces para obtener la primera imagen de cada mascota creé un método dentro del ViewModel. Este es el código: 

        public class PetViewModel
        {
            public IEnumerable<Pet> pet { get; set; }
            public IEnumerable<Image> image {get; set;}
    
            public Image GetFirstImagebyPetId(int Id)
            {
                return image.Where(i => i.PetId == Id).FirstOrDefault();
            }
        }

    Y lo utilizo así en la vista:

    <img src="@Model.GetFirstImagebyPetId(item.PetId).Path" alt="@Model.GetFirstImagebyPetId(item.PetId).Alt">
    Me funciona correctamente, lo que quiero saber es si es buena práctica utilizar métodos de este tipo dentro de un ViewModel o debe manejarse toda la lógica desde el controlador. Muchas gracias.

    miércoles, 2 de diciembre de 2015 0:15

Respuestas

  • >>mi idea es almacenar de 1 a 5 imágenes por mascota, por eso tengo las tablas aparte

    ok pero de alguna forma se relaciona la mascota con sus imagenes, no ?

    entonces cuando cargues el viewmodel podrias definir un linq que ya realice esta union mediente un join de linq

    >>Entonces en ese caso podría omitir la creación del viewmodel no?

    depende, tu usas las entidades de EF directo como model de als view de mvc ? si es asi quizas se podria

    o podrias crear un linq que arme el viewmodel con la estructura de datos que la view necesite

    si la mascota puede tener varias imagenes podrias definir

    public class Pet{
    
       public List<Image> image {get;set;}
    
      //resto propiedades
    
    }

    y esto lo asignas por linq

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Erick Salazar viernes, 4 de diciembre de 2015 0:21
    jueves, 3 de diciembre de 2015 11:16

Todas las respuestas

  • hola

    no seria del todo recomendable, pero si es algo puntual que hace uso de la info que esta contenida dentro de la misma instancia del viewmodel no veo porque no se podria

    igualmente recuerda que puede poner codigo en la view usando

    @model xxx @{ var firstImage = Model.image.FirstOrDefault(i => i.PetId == Id); }

    @if(firstImage != null){ <img src="@firstImage.Path" alt="@firstImage.Alt" />

    }



    creo que eso seria algo mas correcto

    en el codigo no defino como asignas el id con el cual filtras

    otro punto es que usas el FirstOrDefault, que pasa sino hay ninguna imagen ? deberias validarlo o sea no mostrarias la imagen si es que no hay ninguna

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 2 de diciembre de 2015 1:56
  • Hola Leandro

    Si capto tu idea, en ese caso estaba utilizando un foreach. Mira el código:

            @{int i = 1; }
            @foreach (var item in Model.pet)
            {
                if (i > 4)
                {
                    @:</div><div class="row">
                    i = 1;
                }
                <div class="col-md-3">
                    <div class="thumbnail">
                        <img src="@Model.GetFirstImagebyPetId(item.PetId).Path" alt="@Model.GetFirstImagebyPetId(item.PetId).Alt">
                        <div class="caption bg-info">
                            <h3>@{if (item.Name == null)
                                {
                                    @:Mascota sin nombre
                                }
                                else
                                {
                                    @item.Name
                                }
                                }</h3>
                            <p><strong>Descripción: </strong> @item.Description</p>
                            <p><strong>Género: </strong>@item.Gender</p>
                            <p><strong>Tamaño: </strong>@item.Size</p>

    Según tu ejemplo, sería declarar la variable e igualarla en el foreach a cada una de las imágenes según el Id del item y despues mostrarla, cierto ? 

    Aprovecho para preguntarte algo más, los helpers lo ideal es organizarlos en una carpeta aparte o donde se recomienda colocarlos ?

    Muchas gracias.

    miércoles, 2 de diciembre de 2015 3:34
  • hola

    ahh ok estas dentro de un loop iterando por mascota

    pero en ese caso porque la propiedad Image no esta dentro de la e Pet ? o sea

    public class Pet{
    
       public Image image {get;set;}
    
      //resto propiedades
    
    }


    entonces desde el controller cuando generas el viewmodel al cargar la instancia de Pet asignas alli mismo la imagen que a esta le corresponde si es que tinee una

    entonces tu viewmodel quedaria simple

    public class PetViewModel
        {
            public IEnumerable<Pet> pet { get; set; }
    
        }

    ya que la imagen la tiene asignada la mascota

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 2 de diciembre de 2015 9:42
  • Hola otra vez Leandro, pues dime tu si es posible porque estoy usando codefirst y mi idea es almacenar de 1 a 5 imágenes por mascota, por eso tengo las tablas aparte, si lo hago como tu dices no me afectaría en nada la creación de la base de datos ? 

    >> entonces tu viewmodel quedaria simple

    public class PetViewModel
        {
            public IEnumerable<Pet> pet { get; set; }
    
        }

    Entonces en ese caso podría omitir la creación del viewmodel no? Solamente llamaría a la propiedad desde el proyecto donde tengo mis entidades, o recomiendas igualmente crear un viewmodel ?

    Muchas gracias por aclararme las otras dudas, saludos.

    jueves, 3 de diciembre de 2015 3:48
  • >>mi idea es almacenar de 1 a 5 imágenes por mascota, por eso tengo las tablas aparte

    ok pero de alguna forma se relaciona la mascota con sus imagenes, no ?

    entonces cuando cargues el viewmodel podrias definir un linq que ya realice esta union mediente un join de linq

    >>Entonces en ese caso podría omitir la creación del viewmodel no?

    depende, tu usas las entidades de EF directo como model de als view de mvc ? si es asi quizas se podria

    o podrias crear un linq que arme el viewmodel con la estructura de datos que la view necesite

    si la mascota puede tener varias imagenes podrias definir

    public class Pet{
    
       public List<Image> image {get;set;}
    
      //resto propiedades
    
    }

    y esto lo asignas por linq

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Erick Salazar viernes, 4 de diciembre de 2015 0:21
    jueves, 3 de diciembre de 2015 11:16
  • Hola Leandro

    Muchas gracias, agregare la lista de imágenes a la clase mascota, me parece mas ordenado. No estoy usando las entidades de EF directamente para las vistas, de hecho mis entidades estaban hechas 100% para el diseño de la base de datos, pero en ese caso que dices creo que es mejor añadir esta lista que al final el EF no va a tomar en cuenta y me va a servir para la vista.

    Saludos.

    viernes, 4 de diciembre de 2015 0:21