[asp.net-mvc] ¿Qué es ViewModel en MVC?



Answers

El modelo de vista es una clase que representa el modelo de datos utilizado en una vista específica. Podríamos usar esta clase como modelo para una página de inicio de sesión:

public class LoginPageVM
{
    [Required(ErrorMessage = "Are you really trying to login without entering username?")]
    [DisplayName("Username/e-mail")]
    public string UserName { get; set; }
    [Required(ErrorMessage = "Please enter password:)")]
    [DisplayName("Password")]
    public string Password { get; set; }
    [DisplayName("Stay logged in when browser is closed")]
    public bool RememberMe { get; set; }
}

Usando este modelo de vista puede definir la vista (motor de vista Razor):

@model CamelTrap.Models.ViewModels.LoginPageVM

@using (Html.BeginForm()) {
    @Html.EditorFor(m => m);
    <input type="submit" value="Save" class="submit" />
}

Y acciones:

[HttpGet]
public ActionResult LoginPage()
{
    return View();
}

[HttpPost]
public ActionResult LoginPage(LoginPageVM model)
{
    ...code to login user to application...
    return View(model);
}

Que produce este resultado (la pantalla se toma después de enviar el formulario, con mensajes de validación):

Como puede ver, un modelo de vista tiene muchos roles:

  • Los modelos de vista documentan una vista mediante solo campos que se representan a la vista.
  • Los modelos de vista pueden contener reglas de validación específicas usando anotaciones de datos o IDataErrorInfo.
  • El modelo de vista define cómo debe verse una vista (para LabelFor , EditorFor , DisplayFor helpers).
  • Los modelos de vista pueden combinar valores de diferentes entidades de base de datos.
  • Puede especificar plantillas de visualización para ver modelos y reutilizarlos en muchos lugares utilizando DisplayFor o EditorFor helpers.

Otro ejemplo de un modelo de vista y su recuperación: queremos mostrar los datos básicos del usuario, sus privilegios y el nombre de los usuarios. Creamos un modelo de vista especial, que contiene solo los campos obligatorios. Recuperamos datos de diferentes entidades de la base de datos, pero la vista solo tiene en cuenta la clase de modelo de vista:

public class UserVM {
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool IsAdministrator { get; set; }
    public string MothersName { get; set; }
}

Recuperación:

var user = db.userRepository.GetUser(id);

var model = new UserVM() {
   ID = user.ID,
   FirstName = user.FirstName,
   LastName = user.LastName,
   IsAdministrator = user.Proviledges.IsAdministrator,
   MothersName = user.Mother.FirstName + " " + user.Mother.LastName
} 
Question

Soy nuevo en ASP.NET MVC . Tengo un problema para comprender el propósito de un ViewModel .

¿Qué es un ViewModel y por qué necesitamos un ViewModel para una aplicación ASP.NET MVC ?

Es mejor si puedo tener un ejemplo simple.




MVC no tiene un modelo de vista: tiene un modelo, vista y controlador. Un modelo de vista es parte de MVVM (Model-View-Viewmodel). MVVM se deriva del modelo de presentación y se populariza en WPF. También debería haber un modelo en MVVM, pero la mayoría de la gente pierde el punto de ese patrón por completo y solo tendrán una vista y un modelo de vista. El modelo en MVC es similar al modelo en MVVM.

En MVC, el proceso se divide en 3 responsabilidades diferentes:

  • View es responsable de presentar los datos al usuario
  • Un controlador es responsable del flujo de la página
  • Un modelo es responsable de la lógica comercial

MVC no es muy adecuado para aplicaciones web. Es un patrón introducido por Smalltalk para crear aplicaciones de escritorio. Un entorno web se comporta completamente diferente. No tiene mucho sentido copiar un concepto de 40 años del desarrollo de escritorio y pegarlo en un entorno web. Sin embargo, mucha gente piensa que esto está bien, porque su aplicación compila y devuelve los valores correctos. Es decir, en mi opinión, no es suficiente para declarar que una determinada opción de diseño está bien.

Un ejemplo de un modelo en una aplicación web podría ser:

public class LoginModel
{
    private readonly AuthenticationService authentication;

    public LoginModel(AuthenticationService authentication)
    {
        this.authentication = authentication;
    }

    public bool Login()
    {
        return authentication.Login(Username, Password);
    }

    public string Username { get; set; }
    public string Password { get; set; }
}

El controlador puede usarlo así:

public class LoginController
{
    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        bool success = model.Login();

        if (success)
        {
            return new RedirectResult("/dashboard");
        }
        else
        {
            TempData["message"] = "Invalid username and/or password";
            return new RedirectResult("/login");
        }
    }
}

Sus métodos de control y sus modelos serán pequeños, fáciles de probar y al punto.




Una gran cantidad de grandes ejemplos, déjame explicarte de manera clara y crujiente.

ViewModel = Modelo que se crea para servir la vista.

La vista ASP.NET MVC no puede tener más de un modelo, por lo que si necesitamos mostrar propiedades de más de un modelo en la vista, no es posible. ViewModel cumple esta función.

View Model es una clase de modelo que solo puede contener aquellas propiedades que se requieren para una vista. También puede contener propiedades de más de una entidad (tablas) de la base de datos. Como su nombre indica, este modelo se crea específicamente para los requisitos de Vista.

Algunos ejemplos de View Models están debajo

  • Para listar datos de más de entidades en una página de vista, podemos crear un modelo de Vista y tener propiedades de todas las entidades para las cuales queremos listar datos. Únase a esas entidades de base de datos y establezca las propiedades del modelo de visualización y regrese a la vista para mostrar datos de diferentes entidades en una sola forma tabular
  • El modelo de vista puede definir solo campos específicos de una sola entidad que se requiere para la Vista.

ViewModel también se puede usar para insertar y actualizar registros en más de una entidad. Sin embargo, el uso principal de ViewModel es mostrar columnas de múltiples entidades (modelo) en una sola vista.

La forma de crear ViewModel es lo mismo que crear Model, la forma de crear view para Viewmodel es lo mismo que crear view for Model.

Aquí hay un pequeño ejemplo de datos de lista usando ViewModel .

Espero que esto sea útil.




Si tiene propiedades específicas para la vista y no están relacionadas con el almacén de DB / Servicio / Datos, es una buena práctica usar ViewModels. Supongamos que desea dejar seleccionada una casilla de verificación basada en un campo de base de datos (o dos), pero el campo de base de datos en sí mismo no es un booleano. Si bien es posible crear estas propiedades en el propio Modelo y mantenerlo oculto del enlace a los datos, es posible que no desee saturar el Modelo en función de la cantidad de dichos campos y transacciones.

Si hay muy pocos datos y / o transformaciones específicos de la vista, puede usar el propio Modelo






Related