0

在 MVC3 中工作,c#

我想知道模型、类、数据库表和部分类的“层次结构”。

在数据库中,我有一个 UserAccount 表,其结构如下:

USERACCOUNT:用户 ID、名字、姓氏、登录名、密码、电子邮件

在我的项目中,我有一个名为 UserModel 的模型。我正在使用它,所以我可以用数据注释来装饰属性。它被设置为 useraccount 类的元数据类型,如下所示:

[MetadataType(typeof(UserModel))]
public partial class useraccount
{
}

public class UserModel
{
    public int UserId { get; set; }

    [Display(Name="First Name")]
    [StringLength(20)]
    [Required]
    public string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [StringLength(30)]
    [Required]
    public string LastName { get; set; }

    [Display(Name = "Email Address")]
    [StringLength(20)]
    [Required]
    public string email { get; set; }

    [Remote("IsUserNameAvailable", "Validation")]
    [Display(Name = "Choose a Login Name")]
    [StringLength(40)]
    [Required]
    public string login { get; set; }

    [Display(Name = "Choose a Password")]
    [StringLength(64)]
    [Required]
    public string password { get; set; }

    [Display(Name = "Enter Password Again")]
    [StringLength(64)]
    [Required]
    public string confirmPassword { get; set; }

}

请注意,在数据库表中有一个“密码”列,但在 UserModel 中没有“确认密码”。

我的想法是 UserAccount 类,使用 UserModel 类作为元数据,现在应该包含“confirmPassword”的定义。

这是我遇到的问题。在注册视图中,我使用 UserModel 作为模型,所以在页面顶部我有:

@model OurAgreements.Models.UserModel

当我尝试保存时,问题出现在控制器中。这段代码:

    public ActionResult Register(UserModel model)
    {
        var repo = new Repository();

        if (ModelState.IsValid)
        {
            using (var db = new ouragreementEntities())
            {
                db.useraccount.Add(model);
                db.SaveChanges();
            }

            return View();
        }

给出错误,无法将 UserModel 转换为 useraccount。我可以理解这一点,我正在尝试将数据放入与所有列都不匹配的表中。

因此,我想我会将视图上的模型更改为:

 @model OurAgreements.Models.useraccount

因为根据我的想法,useraccount 类应该使用 UserModel,但这样做会产生错误,'useraccount has no definition for 'confirmPassword'

所以我有点卡住了。我知道我可以切换回使用 UserModel 作为模型,然后在控制器中我可以构建一个新的用户帐户实例,并用模型中的数据填充它,然后将实例保存到数据库中。

所以我想我的问题是,为什么 useraccount 不包含confirmPassword 的定义?

4

2 回答 2

1

第一件事。更改类的名称。使用 UserAccountMetadata / UserAccount。这使事情更容易阅读和理解。

此外,在确认密码字段中使用比较属性,以便确保它们匹配。数据类型属性应该出现在两个密码字段中。

[DataType(DataType.Password)]
[Display(Name = "Confirm Password")]
[Compare("Password", ErrorMessage = "Password and confirm password must be same!")]
public string confirmPassword { get; set; }

您的视图使用的模型应该是 UserAccount。

在将您的视图模型 (UserAccount) 传递给将其保存在数据库中的方法之前,您需要将其映射到该方法采用的对象,这看起来像是您的域模型对象。您可以手动执行此操作,但这很麻烦。使用映射工具(例如 AutoMapper)自动为您执行此操作。您可以告诉 AutoMapper UserAccount 中的哪些字段映射到您的域模型中的哪些字段。

于 2013-04-11T22:05:16.647 回答
0

通过创建一个包含 DataAnnotations 和其他不在数据库中的属性的视图模型,您之前走在正确的道路上。此 ViewModel 及其相关的 DataAnnotations 可帮助您执行业务验证逻辑,并允许您将一个或多个表的数据值映射到视图的单个类。

那么,至于我认为您的总体问题是,为什么数据库中没有确认密码?为什么应该有?在数据库中拥有相同数据的两个副本在存储数据领域是没有意义的。

确认密码是一种业务逻辑/用户输入检查,以确保他们没有“粗手指”密码并将自己锁定在他们的帐户之外。一旦您确认他们输入的密码是他们想要的密码(密码 == confirmPassword),您就可以对密码进行哈希处理并将其放入数据库中。

于 2013-04-11T22:02:19.867 回答