我是ASP的新手。净MVC。我在理解ViewModel的目的方面有一个问题。

什么是ViewModel,为什么我们需要一个ASP的ViewModel。NET MVC应用程序?

如果我能给出一个关于它的工作和解释的好例子,那就更好了。


当前回答

如果您有特定于视图的属性,并且与DB/Service/Data存储无关,那么使用ViewModels是一个很好的实践。比方说,您希望根据一个(或两个)DB字段选择一个复选框,但DB字段本身不是布尔值。虽然可以在模型本身中创建这些属性,并将其隐藏在数据绑定中,但您可能不希望根据此类字段和事务的数量使模型变得混乱。

如果特定于视图的数据和/或转换太少,您可以使用模型本身

其他回答

MVC没有视图模型:它有模型、视图和控制器。ViewModel是MVVM (Model-View-ViewModel)的一部分。MVVM派生自表示模型,在WPF中得到推广。在MVVM中也应该有一个模型,但是大多数人完全忽略了这个模式的要点,他们只有一个视图和一个视图模型。MVC中的模型与MVVM中的模型相似。

在MVC中,这个过程分为3个不同的职责:

视图负责将数据显示给用户 控制器负责页面流 模型负责业务逻辑

MVC不太适合web应用程序。它是Smalltalk为创建桌面应用程序引入的一种模式。web环境的行为完全不同。从桌面开发中复制一个40年前的概念并将其粘贴到web环境中并没有多大意义。然而,很多人认为这是可以的,因为他们的应用程序编译并返回正确的值。在我看来,这并不足以说明某种设计选择是可行的。

web应用程序中模型的一个例子可以是:

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; }
}

控制器可以这样使用它:

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");
        }
    }
}

你的控制器方法和模型将是小的,容易测试的,并且是切中要害的。

ViewModel是包含在MVC视图中使用的字段的模型。对视图使用ViewModel有以下好处:

由于数据库模型(实体类)包含单个表的数据。如果需要来自多个表的数据,一个ViewModel可以有多个表的字段。 用户不能直接与数据库模型交互,因此数据库层或模型是安全的。 它用于通过存储库从数据库模型获取数据并将其传递给视图。类似地,它利用向数据库模型发布数据来更新数据库记录。

视图模型是数据的概念模型。例如,它的用途是获取一个子集或组合来自不同表的数据。

您可能只需要特定的属性,因此这允许您只加载那些属性,而不添加不必要的属性。

我没有阅读所有的帖子,但每个答案似乎都缺少一个真正帮助我“理解”的概念……

如果一个模型类似于一个数据库表,那么一个ViewModel类似于一个数据库视图——一个视图通常要么返回来自一个表的少量数据,要么返回来自多个表(连接)的复杂数据集。

我发现自己使用ViewModels将信息传递到视图/表单中,然后在表单返回到控制器时将数据传输到有效的模型中-对于存储列表(IEnumerable)也非常方便。

视图模型通常是两个或多个模型的聚合/组合。

假设我们有一个DB,它有两个表,分别叫Student和Course,每个表有两个模型。在客户端,我们有两个视图来呈现每个表。

想象一下,您需要另一个同时呈现学生和课程的视图?然后你可以创建一个所谓的视图模型。这基本上是一个采用两种模型的类,即学生和课程。

类combinedstudentcourses将是视图模型,并可以由视图返回。

public class Student
{
    public string? Name{ get; set; }
    public string? Email{ get; set; }        
}

这是我们的视图模型,其中有两个模型。

public class Course
{
    public string? CourseName { get; set; }
    public string? CourseCode { get; set; }        
}

ViewModel,即组合两个或多个模型来满足视图的特定需求。

public class SchoolSystem
{
    public Students Student { get; set; }
    public Courses Course { get; set; }        
}
 public ActionResult<SchoolSystem> Index()
    {
      var SchoolSystemViewModel = new SchoolSystem();
        // now we have access two to tables i.e two models in our 
        //view.
      return this.View("SchoolSystemView", SchoolSystemViewModel,);
    }