Asp.net mvc 3 用部分类扩展类

Asp.net mvc 3 用部分类扩展类,asp.net-mvc-3,entity-framework,Asp.net Mvc 3,Entity Framework,在MVC3、c中工作# 我想知道模型、类、db表和部分类的“层次结构” 在db中,我有一个UserAccount表,其结构如下: USERACCOUNT:UserId、firstname、Lastname、登录名、密码、电子邮件 在我的项目中,我有一个名为UserModel的模型。我使用它是为了用数据注释装饰属性。它被设置为useraccount类的元数据类型,如下所示: [MetadataType(typeof(UserModel))] public partial class useracc

在MVC3、c中工作#

我想知道模型、类、db表和部分类的“层次结构”

在db中,我有一个UserAccount表,其结构如下:

USERACCOUNT:UserId、firstname、Lastname、登录名、密码、电子邮件

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

这就是我遇到的问题。在Register视图中,我使用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的定义?

您以前的做法是正确的,创建了一个视图模型,其中包含数据库中不包含的数据批注和其他属性。此ViewModel及其相关的DataAnnotation可帮助您执行业务验证逻辑,并允许您将一个或多个数据表映射到视图的单个类

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


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

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

另外,在确认密码字段中使用compare属性,以便确保它们匹配。datatype属性应该出现在两个密码字段中

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