用部分类展开类



在MVC3中工作,c#

我想知道一个模型,类,数据库表和部分类的"层次结构"。

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

USERACCOUNT:用户名,姓,名,登录名,密码,电子邮件

在我的项目中,我有一个名为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; }
}

注意在数据库表中有一个'Password'列,但没有'confirmPassword'列,然而在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没有定义'confirmPassword'

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

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

重要的事情先说。更改类的名称。使用UserAccountMetadata/UserAccount。这使得事情更容易阅读和理解。

另外,在确认密码字段上使用compare属性,以便您可以确保它们匹配。数据类型属性应该同时出现在两个密码字段中。

[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中的哪些字段映射到域模型中的哪些字段。

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

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

确认密码是一个业务逻辑/用户输入检查,以确保他们没有"胖手指"密码并锁定自己的帐户。一旦确认他们输入的密码是他们想要的密码(password == confirmPassword),就可以对密码进行散列并将其放入数据库中。

最新更新