0

我有一个关于 MVC 3 的问题以及关于视图和模型的更多问题。我想提一下,我是 MVC 的新手,所以我只是在学习它。

基本上例如让我们采取注册表格:

我有一个控制器、视图和模型来注册一个新用户。

  • 帐户控制器
  • 注册.chtml
  • AccountModel => 注册模型

现在,在注册模型中,我拥有所有带有数据注释的数据成员,例如:

    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

然后将其呈现在视图中。

有什么困扰我,或者我真的不明白如何正确地做到这一点:

好的,我有 RegistrationModel ......但稍后,例如,如果我想呈现用户的个人资料,我应该再次调用registrationmodel 还是它将是profilemodel?所以基本上我会有很多相同的模型来渲染同样的东西......不是吗?

我不能有一个通用模型,比如用户,然后我可以通过 RegistrationModel/ProfileModel 来查看用户。

也许有点难以理解我的确切意思,但我是如何想象的:例如用户提交一个表单,所有内容都被解析并使用所有数据成员创建一个用户对象,然后这个用户对象被传递给 DAL ,它被提交给数据库。稍后有人访问此用户的个人资料和 DAL,将返回用户对象,然后显示。

4

1 回答 1

1

您的问题的答案是否定的,您通常应该将域模型与视图模型分开。考虑以下场景。假设您有一个 User 模型,并且您的业务逻辑允许您添加新用户和编辑现有用户。假设您的用户模型如下所示:

public class User
{
    [Required]
    public int? UserId {get; set;}
    [Required]
    public string LastName {get; set;}
    [Required]
    public string FirstName {get; set;}
    [Required]
    public string Password {get; set;}
    public bool IsAdmin {get; set;}
}

现在,为了使您的用户模型有效,您必须拥有用户 ID 才能识别用户。当您插入新用户时,您不需要 ID,因为这是数据库在插入时会自动处理的内容。但是,当您更新用户时,您需要填充用户 ID。所以现在你有一个模型,在一种情况下需要一个字段(UserId),但在另一种情况下不需要。你打算怎么处理?

答案是视图模型,这就是它们存在的原因,以及为什么建议为项目中的每个条目表单创建一个。在这种情况下,您最终会得到不同的插入和更新用户视图模型。我知道将这些视图模型转换为底层域模型很乏味,但是有一些库可以帮助您自动执行此操作,例如 AutoMapper ( https://github.com/AutoMapper/AutoMapper/wiki/Getting-started )。

第二个可能更严重的问题是过度发布。假设您正在使用上述 User 模型来编辑数据库中的用户。现在模型有一个 IsAdmin 字段,它指定用户是否是管理员。现在您的编辑用户视图将省略此字段,因为您不希望普通用户能够使自己成为管理员。但是,假设您正在与一个非常聪明的用户打交道,他创建了一个 id 为 IsAdmin 的隐藏字段,并使其值为 true:

 <input type="hidden" id="IsAdmin" value="true" />

然后他/她将表单发布到您的保存用户网址。因为您正在使用具有 IsAdmin 属性的域逻辑用户模型,所以此隐藏字段将映射到您的模型,并且该用户只是设法在您的站点中创建自己和管理员。这正是您需要视图模型的原因,因此这种情况永远不会发生。

于 2013-05-19T09:53:13.813 回答