问题与编辑使用自定义模式

问题与编辑使用自定义模式

问题描述:

我有这个数据模型:问题与编辑使用自定义模式

public class User 
    { 
     public long UserID { get; set; } 

     [Required(ErrorMessage = "User name is required.")] 
     [MaxLength(50, ErrorMessage = "User name cannot be longer than 50 characters.")] 
     public string UserName { get; set; } 

     [Email] 
     [Required(ErrorMessage = "Email is required.")]   
     [MaxLength(100, ErrorMessage = "Email cannot be longer than 100 characters.")] 
     public string Email { get; set; } 

     [Required(ErrorMessage = "Password is required.")] 
     [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
     [DataType(DataType.Password)]   
     public string Password { get; set; } 

     [MaxLength(150, ErrorMessage = "Full name cannot be longer than 150 characters.")] 
     public string FullName { get; set; } 

     public int UserTypeID { get; set; } 

     public virtual UserType UserType { get; set; } 
     public virtual ICollection<Page> Pages { get; set; } 
    } 

和我使用这个模型只是修改某些字段(密码不应该是编辑):

public class EditUserModel 
    { 
     public long UserID { get; set; } 

     [Required] 
     [Display(Name = "User name")] 
     public string UserName { get; set; } 

     [Email] 
     [Required(ErrorMessage = "Email is required.")] 
     [MaxLength(100, ErrorMessage = "Email cannot be longer than 100 characters.")] 
     public string Email { get; set; } 

     [DataType(DataType.Text)] 
     [Display(Name = "Full name")] 
     [MaxLength(150, ErrorMessage = "Full name cannot be longer than 150 characters.")] 
     public string FullName { get; set; } 

     public int UserTypeID { get; set; } 

     public virtual UserType UserType { get; set; } 
    } 

但我很困惑如何将EditUserModel传递到我的数据上下文来更新它。对不起,如果看起来很简单,但我真的很难过。

这是自动生成的编辑操作,我修改:

[IsAdministrator] 
[HttpPost] 
     public ActionResult Edit(EditUserModel user) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Entry(user).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      ViewBag.UserTypeID = new SelectList(db.UserTypes, "UserTypeId", "Name", user.UserTypeID); 
      return View(user); 
     } 

这是我遇到的麻烦线路:

db.Entry(user).State = EntityState.Modified; 

我创建的原因自定义类是避免暴露视图中的密码。

由于您试图保存视图模型,因此无法正常工作。

您可以使用AutoMapper将视图模型中的数据重写为您的数据模型。之后,您应该可以保存更改。

User userModel = Mapper.Map<EditUserModel, User>(user); 
userModel = // todo: get password from database 
// todo: attach your model to context and save changes 

我使用实体框架代码第一,这种方法很好。

+0

谢谢,但有没有另一种方式下载Automapper? – Ron

+0

您可以从数据库上下文获取用户对象,并从视图模型中重写值。 – krolik

+0

我试过,但db.Entry(用户).State = EntityState.Modified;将不适用于我的视图模型。 – Ron