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



5 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 de 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);
}

Lo que produce este resultado (la pantalla se muestra después de enviar el formulario, con los mensajes de validación):

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

  • Ver modelos de modelos de una vista que consiste solo en campos, que se representan en la vista.
  • Los modelos de vista pueden contener reglas de validación específicas que usan anotaciones de datos o IDataErrorInfo.
  • El modelo de vista define el aspecto que debe tener una vista (para los LabelFor de LabelFor , EditorFor , DisplayFor ).
  • Los modelos de vista pueden combinar valores de diferentes entidades de base de datos.
  • Puede especificar fácilmente plantillas de visualización para ver modelos y reutilizarlas en muchos lugares con 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 requeridos. Recuperamos datos de diferentes entidades de la base de datos, pero la vista solo es consciente de 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
} 
asp.net-mvc viewmodel

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

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

Es mejor si puedo tener un ejemplo simple.




Si tiene propiedades específicas de la vista y no relacionadas con el DB / Service / Data store, es una buena práctica usar ViewModels. Supongamos que desea dejar una casilla de verificación seleccionada en función de un campo DB (o dos), pero el campo DB en sí no es un valor booleano. Si bien es posible crear estas propiedades en el propio Modelo y mantenerlas ocultas 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 utilizar el propio Modelo




MVC no tiene un modelo de visualización: tiene un modelo, una vista y un controlador. Un modelo de vista es parte de MVVM (Modelo-Vista-Modelo de vista). 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 las personas se saltan 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 empresarial.

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.




View model a es una clase simple que puede contener más de una propiedad de clase. Lo usamos para heredar todas las propiedades requeridas, por ejemplo, tengo dos clases, estudiante y materia

Public class Student
{
public int Id {get; set;}
public string Name {get; set;}
}  
Public class Subject
{
public int SubjectID {get; set;}
public string SubjectName {get; set;}
}

Ahora queremos mostrar los registros del Nombre del estudiante y el Nombre del sujeto en la vista (En MVC), pero no es posible agregar más de una clase como:

 @model ProjectName.Model.Student  
 @model ProjectName.Model.Subject

el código anterior arrojará un error ...

Ahora creamos una clase y podemos darle cualquier nombre, pero este formato "XyzViewModel" lo hará más fácil de entender. Es concepto de herencia. Ahora creamos una tercera clase con el siguiente nombre:

public class StudentViewModel:Subject
{
public int ID {get; set;}
public string Name {get; set;}
}

Ahora usamos este ViewModel en Vista

@model ProjectName.Model.StudentViewModel

Ahora podemos acceder a todas las propiedades de StudentViewModel y la clase heredada en View.




Un modelo de vista es un modelo conceptual de datos. Su uso es, por ejemplo, obtener un subconjunto o combinar datos de diferentes tablas.

Es posible que solo desee propiedades específicas, por lo que esto le permite cargar solo esas propiedades y no propiedades adicionales innecesarias




Related