具有EF 4.1数据库优先级/ ASP.NET MVC 3的哈希密码

时间:2011-07-25 19:33:34

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

我正在推出自己的身份验证系统,而且我遇到了需要指导的情况。

我首先使用EF 4.1代码 。我已经设计了我的数据库,以包含一个带有Id,Email和HashedPassword列的User表。然后我让EF根据此表创建一个实体。然后我创建了一个部分类来处理我的验证。

问题是在我看来我想要一个电子邮件,密码和确认密码的文本框。我需要验证密码和确认密码(必需和比较)。我可以将这些添加到我创建的验证类中,但因为它们不是为User表创建的实体EF的一部分,所以当我尝试查看页面时出现编译器错误。

我的部分课程

[MetadataType(typeof (UserMetadata))]
    public partial class User
    {
        private class UserMetadata
        {
            [Required]
            public string Email { get; set; }

            [Required]
            public string Password { get; set; }

            [Required]
            [Compare("Password")]
            public string ConfirmPassword { get; set; }
        }
    }

我的观点

<h1>Sign Up</h1>
@using (Html.BeginForm("Create", "Users", FormMethod.Post))
{
    @Html.ValidationSummary()
    <p>
        @Html.LabelFor(x => x.Email)<br />
        @Html.TextBoxFor(x => x.Email)
    </p>
     <p>
        @Html.LabelFor(x => x.Password)<br />
        @Html.TextBoxFor(x => x.Password)
    </p>
    <p>
        @Html.LabelFor(x => x.ConfirmPassword)<br />
        @Html.TextBoxFor(x => x.ConfirmPassword)
    </p>

    <p class="button">
        <input type="submit" value="Submit" /></p>
}

我的模特

表名:用户 列:Id,电子邮件,HashedPassword

我怎样才能解决这个问题?

由于

2 个答案:

答案 0 :(得分:2)

最简单的答案似乎是制作一个ViewModel,它包含MVC部分的PasswordConfirmPassword字段。当您准备好保存到数据库时,请使用它来创建带有HashedPassword的EF模型版本。

也就是说,我在我的视图中使用了不存在ViewModel的EF模型中不存在的属性,方法是在尝试时添加部分类。我认为问题是你在元数据类中有这些,当它们不是真正的元数据时。试试这个:

[MetadataType(typeof (UserMetadata))]
public partial class User
{
    [Required]
    public string Password { get; set; }

    [Required]
    [Compare("Password")]
    public string ConfirmPassword { get; set; }

    private class UserMetadata
    {
        [Required]
        public string Email { get; set; }


    }
}

此版本定义了一些新属性,然后更改电子邮件上的元数据以添加[Required]

答案 1 :(得分:1)

您的视图模型是用户实体本身,它不定义ConfirmPassword属性。我建议您创建一个全新的视图模型类,而不是使用AutoMapper在这两个类之间轻松映射。