我正在推出自己的身份验证系统,而且我遇到了需要指导的情况。
我首先使用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
我怎样才能解决这个问题?
由于
答案 0 :(得分:2)
最简单的答案似乎是制作一个ViewModel,它包含MVC部分的Password
和ConfirmPassword
字段。当您准备好保存到数据库时,请使用它来创建带有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在这两个类之间轻松映射。