ASP.NET Core MVC中的Model和ViewModel有什么区别?

Hel*_*rld 2 asp.net model-view-controller asp.net-mvc model-view

我有一个用于帐户模型的Account类。

public class Account
{
    [Key]
    public Int64 UID { get; set; }

    [Required]
    public string ID { get; set; }

    [Required]
    public string PassWord { get; set; }
    [Required]
    public string UserName { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

我的项目不是代码优先项目,这是数据库“帐户”的模型类。

但是我在登录视图中仅使用了两个属性,字符串ID和字符串PassWord。因此,当我检查模型的验证时,因为我仅使用两个属性,所以无法在登录控制器中使用ModelState.Isvalid()。

因此,我进行了搜索,现在发现了“ ViewModel”,这是用于视图的模型类。

然后,我创建了一个新类'AccountViewModel',然后将其与视图而不是'Account'模型一起映射。

我的方法正确吗?我知道ViewModel是仅用于View的模型类。并且Model类适用于所有人。(如全局含义...?对于数据库,视图等)

Model和ViewModel类之间有什么区别?我可以找到解决这个问题的好方法吗?

Shy*_*yju 5

顾名思义,视图模型非常特定于视图,它将是一个简单的POCO,仅包含视图所需的那些属性。

您的另一个模型类是您的实体模型。因此,如果您使用的是EF代码优先方法,则需要EF将根据其生成数据库表的实体类定义。因此,基本上这些实体类看起来与您的db模式结构非常相似。

通过创建视图模型,您将消除实体类与UI层之间的强耦合。现在您的UI层独立于您的实体类,并且如果您决定将数据访问代码从EF更改为其他内容,则完全不需要触摸视图,您只需要更新映射部分(从视图数据访问/服务层实体的模型)

视图模型有时看起来与您的实体模型非常相似,尤其是当您的实体模型是简单的表/类时。

在您的情况下,由于视图要传递用户名和密码,因此您需要一个仅具有这两个属性的简单视图模型。用户提交表单时,您可以读取值并根据需要使用它来构建域实体类对象。

public class LoginViewModel
{
  public string UserId { set;get;}
  public string Password  { set;get; }
}
Run Code Online (Sandbox Code Playgroud)

您可以在视图模型中使用数据注释。MVC模型验证框架使用这些数据注释进行验证。例如,由于用户应输入UserId和Password,因此可以使用适当的注释来修饰它们。

public class LoginViewModel
{
   [Required]
   public string UserId { set;get;}

   [Required]
   public string Password  { set;get; }
}
Run Code Online (Sandbox Code Playgroud)

[Key]定义实体类时,该属性更有用。因此,我认为视图模型不需要它。请记住,视图模型更像是一个UI问题。它根本不了解您的基础数据存储机制。

视图模型属性中最常用的一些属性是

  1. 需要
  2. 最小长度
  3. 范围
  4. 网址
  5. 电话
  6. 字符串长度
  7. 数据类型