【问题标题】:What is difference between Model and ViewModel in asp.net core mvc? [duplicate]asp.net core mvc中的Model和ViewModel有什么区别? [复制]
【发布时间】:2018-02-19 21:13:23
【问题描述】:

我有一个帐户模型的帐户类。

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

}

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

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

所以我当时搜索了一下,现在我发现了“ViewModel”,它是视图的模型类。

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

我的方法对吗? 我知道 ViewModel 是一个仅用于 View 的模型类。 模型类适用于所有人。 (比如全局意义...?对于 DB、view 等)

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

【问题讨论】:

  • 非常感谢。但我对模型有更多疑问。我知道 ViewModel 用于 view , Model 用于 DB Context。那么...我是否必须将 [Key] 或 [Required] 等注释设置为与我的真实 MSSQL DB 表列相同?

标签: asp.net asp.net-mvc model-view-controller model-view


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2022-01-04
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多