2011-09-08 107 views
0

我有這個數據模型:問題與編輯使用自定義模式

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; 

我創建的原因自定義類是避免暴露視圖中的密碼。

回答

1

由於您試圖保存視圖模型,因此無法正常工作。

您可以使用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