使用分部类扩展类

时间:2013-04-11 21:14:04

标签: asp.net-mvc-3 entity-framework

在MVC3中工作,c#

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

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

USERACCOUNT:UserId,名字,姓氏,登录名,密码,电子邮件

在我的项目中,我有一个名为UserModel的模型。我正在使用它,所以我可以使用dataannotations来装饰属性。它被设置为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; }

}

请注意,在数据库表中有一个“密码”列,但没有“confirmPassword”,但是在UserModel中,有。[/ p>

我的想法是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的定义?

2 个答案:

答案 0 :(得分:1)

首先要做的事情。更改课程的名称。使用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映射中的哪些字段到您域中的哪些字段建模。

答案 1 :(得分:0)

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

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

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