TOC

This article has been localized into Spanish by the community.

Modelos:

ViewModels

Ya hemos trabajado con Modelos en varias ocasiones en este tutorial, pero si miras en otro material sobre ASP.NET MVC o solo sobre el patrón MVC en general, tú puedes notar que se menciona frecuentemente algo llamado "View-Model". Pero ¿cuál es la diferencia entre un Model y un ViewModel?. De hecho, siempre que tú pasas un Modelo a una Vista, se considerada más bien un ViewModel porque éste es usado por la Vista. En otras palabras, no hay una diferenciación - puedes usar tus Models como ViewModels sin distinción.

Hay, sin embargo, muchas situaciones dónde puedes querer crear un ViewModel específico para una Vista específica. Esto puede ser para extender o simplificar un Modelo existente, o porque tú quieres representar algo en tu Vista que no está cubierto por uno de tus Modelos.

Los ViewModels son frecuentemente puestos en tu propio directorio en tu proyecto, llamado "ViewModels". De nuevo, esto es sólo una convención y ya que son clases regulares de .NET, eres libre de colocarlos donde sea que quieras, pero normalmente hace Sentido seguir estas convenciones juntos algunas personas también prefieren agregar un postfijo al nombre de la clase con la palabra ViewModel, por ejemplo "AddressViewModel" o "EditUserViewModel".

¿Cuándo usar un ViewModel?

Aquí hay un par de situaciones donde podrías beneficiarte de un ViewModel:

Para representar algo en la Vista que no está ya contenido por un Modelo existente: Cuando pasas un Modelo a la Vista, eres libre de pasar por ejemplo una cadena u otro tipo simple, pero si tú quieres pasar múltiples valores, puede tener más sentido crear un simple ViewModel para almacenar los datos, como éste:

public class AddressViewModel    
{    
public string StreetName { get; set; }    

public string ZipCode { get; set; }    
}

Para acceder a los datos de múltiples modelos desde la misma vista: esto es relevante en muchas situaciones, por ejemplo cuando quieres crear un formulario donde puedas editar la información de múltiples modelos al mismo tiempo. Podrías crear un ViewModel como éste:

public class EditItemsViewModel      
{  
public Model1Type Model1 { get; set; }      

public Model2Type Model2 { get; set; }      
}

Para simplificar un Modelo existente: Imagina que tienes una gran clase con información sobre un usuario. Quizás incluso información sensible como contraseñas. Cuando quieras exponer esta información a la Vista, puede ser beneficioso solamente poner las partes que necesites. Por ejemplo, tu puedes tener un pequeño widget mostrando que el usuario está logueado, con el nombre de usuario que tienen y por cuánto tiempo ha estado logueado. Así que en vez de pasar tu modelo User entero, puedes pasar un ViewModel más ligero, diseñado específicamente para este propósito:

public class SimpleUserInfoViewModel   
{
    public string Username { get; set; }

    public TimeSpan LoginDuration { get; set; }  
}

Para extender un modelo existente con datos relevantes solamente para la vista: Por otro lado, a veces su modelo contiene menos información que la que necesitas en tu vista. Un ejemplo de esto podría ser que tú quieres algunas propiedades convenientes o métodos los cuales son solamente relevantes para la vista y no para todo su modelo en general, como en este ejemplo donde extendemos un modelo User (llamado WebUser) con una propiedad LoginDuration, calculado de la propiedad LastLogin DateTime que ya se encuentra en la clase WebUser:

public class WebUser    
{    
public DateTime LastLogin { get; set; }    
}

De aquí a allá hay dos formas de hacer esos: Tú puedes extender esta clase(heredar de ella) o agregar una propiedad para la instancia WebUser en el ViewModel. Como esto:

public class UserInfoViewModel
{
    public WebUser User { get; set; }

    public TimeSpan LoginDuration
    {
get
{
    return DateTime.Now - this.User.LastLogin;
}
    }
}

O como esto:

public class ExtendedUserInfoViewModel : WebUser
{
    public TimeSpan LoginDuration
    {
get
{
    return DateTime.Now - this.LastLogin;
}
    }
}

Resumen

Un ViewModel es básicamente un Modelo pasado a una Vista, pero como ser indica en este artículo, hay muchas formas de hacerlo - tú puedes usar un Modelo existente, así cómo está, o crear uno nuevo, específico para la Vista en cuestión.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!