jua*_*25d 7 model-view-controller asp.net-mvc design-patterns entity-framework
我正在开发一个ASP.NET MVC 3应用程序,我首先使用实体框架代码来创建我的应用程序的类,并且我还有一个存储库以便对其执行操作,保持DBContext和DBEntities的清洁定义.
我的疑问是关于视图的渲染以及保存编辑模型的方式.
如果我有这个实体代表我的数据库中存储的用户:
//Entity:
public class User
{
[Key]
public int IdUser { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想显示一个包含FirstName,LastName,Email和NewPassword,ConfirmPasword和CurrentPassword的视图,以便让用户更改他的数据,输入CurrentPassword来确认更改,所以我怀疑是,像ConfirmPasword和CurrentPassword这样的人在我的实体中,所以我需要为此View创建一个新模型,并将我想要的信息从我的新模型复制到我的数据库实体以保存它?喜欢:
public class UpdateUserModel
{
[Required]
[Display(Name = "Name")]
public string FirstName{ get; set; }
[Required]
[Display(Name = "Last Name")]
public string LastName{ get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Not valid email")]
public string Email { get; set; }
[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPasword{ get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm the New Pasword")]
[Compare("NewPasword", ErrorMessage = "Password doesn´t mach.")]
public string ConfirmPasword{ get; set; }
[Required(ErrorMessage = "Need to specify the current password to save changes")]
[DataType(DataType.Password)]
[Display(Name = "Current Password")]
public string CurrentPassword { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我做的控制器中:
public ActionResult UpdateUser(UpdateUserModel model)
{
User u = (User)Membership.GetUser();
u.FirstName = model.FirstName;
u.LastName = model.LastName;
u.Email = model.Email;
if (!String.IsNullOrEmpty(model.NewPassword))
{
u.Password = FormsAuthentication.HashPasswordForStoringInConfigFile(model.NewPassword.Trim(), "md5");
}
repository.UpdateUser(u);
return View();
}
Run Code Online (Sandbox Code Playgroud)
有任何方法可以做这样的控制器,如:
public ActionResult UpdateUser(User u)
{
repository.UpdateUser(u);
return View();
}
Run Code Online (Sandbox Code Playgroud)
因为,如果我有,我如何添加像ConfirmPassword或CurrentPassword这样的字段,以便对此特定视图进行验证.
小智 6
如果我是你,我不会在我的表示层使用域模型.我将创建一个视图模型(另一个类),它将与我的域模型非常相似.然后我会使用自动映射工具从我的域模型映射到视图模型.
这是一种非常常见的情况,因此如果您使用谷歌"视图和域"模型,您应该找到所需的一切.
public class User {
[Key]
public int IdUser { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
public class UpdateUserViewModel {
// Original fields
public string Password { get; set; }
public string PasswordConfirmation { get; set;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以配置自动映射器以删除锅炉板代码:
public ActionResult ShowUser()
{
var domainModel = new User(); // I'm assuming that properties are set somewhere
var viewModel = new UserViewModel();
Autommaper.Map(domainModel, viewModel);
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
这非常粗糙,但希望你能有所了解.
更新1:**
据我所知,最好为每个视图创建一个新模型,然后将其映射到实体中
它不仅更好,它提供了更好的关注点分离,使您的代码易于测试.只需查看类的名称,我就可以看到它的用途UpdateUserViewModel,RegisterUserViewModel等).
原始字段,在这个类中应该是带有验证的元数据,而那些东西不是?
原始字段我的意思是:
public class UserViewModel{
public string UserName { get; set; }
public string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这些字段已经在您的User类中,所以我通过不再输入它来节省我的时间.
这将改变我的模型从MVC到MVVM或不是因为我仍然有一个控制器?
我相信我所建议的仍然是MVC模式,而不是MVVM.
关于Automaper,您使用的是github.com/AutoMapper/AutoMapper吗?
Automapper是我用过的东西.那里有很少的工具,它们几乎完全相同.尝试一下,找到最适合您需求的产品.
祝好运.