在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的定义?
答案 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),您就将密码哈希并将其放入数据库中。