asp.net core mvc 中的 Model 和 ViewModel 有什么区别?

What is difference between Model and ViewModel in asp.net core mvc?

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

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

}

我的项目不是代码优先项目,这是数据库 'Account' 的模型 class。

但是我在登录视图中只使用了两个属性,string ID 和 string PassWord。 所以当我检查模型验证时我不能在登录控制器中使用 ModelState.Isvalid() 因为我使用 只有两个属性...

所以我当时搜索了一下,现在我找到了 'ViewModel',这是供查看的模型 class。

然后我创建了一个新的 class 'AccountViewModel' 然后我用视图而不是 'Account' 模型映射了它。

我的方法对吗? 我了解 ViewModel 是一个仅用于 View 的模型 class。 模型 class 适用于所有人。 (比如全局意义...?对于数据库、视图等)

Model 和 ViewModel 有什么不同 class? 我可以找到解决这个问题的好方法吗?

顾名思义,视图模型非常具体 view.It 将是一个简单的 POCO,只有视图所需的那些属性。

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

通过创建视图模型,您将移除实体class与UI层的强耦合。现在您的 UI 层独立于您的实体 classes,如果您决定将数据访问代码从 EF 更改为其他代码,则无需触及 all.You 处的视图只需要更新映射部分(从视图模型到数据access/service层实体)

视图模型有时看起来与您的实体模型非常相似,尤其是如果您的实体模型是简单的 table/class。

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

public class LoginViewModel
{
  public string UserId { set;get;}
  public string Password  { set;get; }
}

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

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

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

当您定义实体 class 时,[Key] 属性更有用。所以我认为视图模型不需要它。请记住,视图模型更像是一个 UI 问题。它根本不知道你的底层数据存储机制。

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

  1. Required
  2. MinLength
  3. Range
  4. Url
  5. Phone
  6. StringLength
  7. DataType