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类之间有什么区别?我可以找到解决这个问题的好方法吗?
顾名思义,视图模型非常特定于视图,它将是一个简单的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问题。它根本不了解您的基础数据存储机制。
视图模型属性中最常用的一些属性是