MVC3注册表和模型

时间:2013-05-19 08:52:43

标签: asp.net-mvc-3 asp.net-membership registration

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

基本上,例如,我们可以选择注册表格:

我有一个控制器,视图和模型,可以注册一个新用户。

  • 的AccountController
  • Register.chtml
  • AccountModel => RegisterationModel

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

    [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?所以基本上我会有很多相同的模型只是为了渲染相同的东西......不是吗?

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

也许有点难以理解我的意思,但我想象的是:例如用户提交表单,解析所有内容并使用所有数据成员创建User对象,然后此User对象是适用于DAL,它被提交给DB。稍后有人访问此用户的配置文件和DAL时,将返回User对象,然后显示该对象。

1 个答案:

答案 0 :(得分:1)

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

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)。

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

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

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