Asp.net mvc 3 用部分类扩展类
在MVC3、c中工作# 我想知道模型、类、db表和部分类的“层次结构” 在db中,我有一个UserAccount表,其结构如下: USERACCOUNT:UserId、firstname、Lastname、登录名、密码、电子邮件 在我的项目中,我有一个名为UserModel的模型。我使用它是为了用数据注释装饰属性。它被设置为useraccount类的元数据类型,如下所示: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
[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中的哪些字段映射到域模型中的哪些字段