2012-06-25 27 views
5

Tôi có ba mô hình sắp đến với nhau để tạo một mô hình xem và tôi muốn có thể chỉnh sửa mô hình chế độ xem đó khi nhấp vào "chỉnh sửa". Tôi không thể tìm thấy một ví dụ thẳng về cách thức hoạt động của nó (ở bất kỳ đâu).Làm cách nào để cập nhật mô hình chế độ xem từ trang chỉnh sửa trong MVC3?

Tôi không chắc mình có đi đúng hướng hay không. Tôi có thể xem được dữ liệu. Tại thời điểm này, tôi không thể lưu nó.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn!

Models:

public class Person 
{ 
    [Key] 
    public int Id { get; set; } 

    [MaxLength(20)] 
    [Required(ErrorMessage = "First name is required.")] 
    public string FirstName { get; set; } 

    [MaxLength(20)] 
    [Required(ErrorMessage = "Last name is required.")] 
    public string LastName { get; set; } 
    [MaxLength(40)] 
    [Required(ErrorMessage = "Email is required.")] 
    public string Email { get; set; } 
    [MaxLength(20)] 
    [DataType(DataType.PhoneNumber)] 
    public string Phone { get; set; } 

    public bool Active { get; set; } 
} 


    public class ClientContact 
{ 
    [Key] 
    [ForeignKey("Person")] 
    public int ClientPersonId { get; set; } 
    public int ClientId { get; set; } 
    [MaxLength(40)] 
    public string Title { get; set; } 

    public Person Person { get; set; } 
    [ForeignKey("ClientId")] 
    public Client Client { get; set; } 
} 

    public class Client 
{ 
    [Key] 
    public int ClientId { get; set; } 
    public string Name { get; set; } 
    public bool Active {get;set;} 

} 

Xem mẫu:

public class ClientContactViewModel 
{ 

    private SimplexDB db = new SimplexDB(); 


    public ClientContactViewModel() 
    { 

    } 


    public ClientContactViewModel(int id) 
    { 
     ClientPersonId = id; 
     InitializeClientContact(); 
    } 

    public int ClientPersonId { get; set; } 


    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 
    [Display(Name = " Last Name")] 
    public string LastName { get; set; } 
    [Display(Name = "Title")] 
    public string Title { get; set; } 
    [Display(Name = "Email Address")] 
    public string Email { get; set; } 
    [Display(Name = "Phone")] 
    public string Phone { get; set; } 
    [Display(Name = "Client Name")] 
    public int ClientId { get; set; } 


    public SelectList Clients 
    { 
     get 
     { 
      return new SelectList(db.Clients, "ClientId", "Name"); 

     } 
    } 

    private void InitializeClientContact() 
    { 
     var contact = db.ClientPersons.Include("Person").Where(x => x.ClientPersonId == ClientPersonId).SingleOrDefault(); 
     if (contact != null) 
     { 
      FirstName = contact.Person.FirstName; 
      LastName = contact.Person.LastName; 
      Title = contact.Title; 
      Email = contact.Person.Email; 
      Phone = contact.Person.Phone; 
      ClientId = contact.ClientId; 

     } 
    } 



} 

Bộ điều khiển:

   public class ClientContactController : Controller 
    { 
     private database db = new database(); 

// 
     // GET: /ClientContact/Edit/5 

     public ActionResult Edit(int id) 
     { 
      return View(new ClientContactViewModel(id)); 
     } 

     // 
     // POST: /ClientContact/Edit/5 

     [HttpPost] 
     public ActionResult Edit(ClientContactViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Entry(model).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      return View(model); 
     } 
} 

tôi nhận được một lỗi tại db.Entry (model) .State ... " Kiểu thực thể ClientContactViewModel không phải là một phần của mô hình cho ngữ cảnh hiện tại. "

Trả lời

9

ViewModel của bạn không phải là một thực thể. Bạn nên ánh xạ ViewModel của bạn vào thực thể của bạn, sau đó đặt trạng thái của thực thể thành sửa đổi.

Về cơ bản, điều này có nghĩa là bạn nên đặt giá trị pháp nhân của mình với giá trị của mô hình chế độ xem. Bạn có thể sử dụng AutoMapper hoặc xử lý nó bằng tay:

[HttpPost] 
    public ActionResult Edit(ClientContactViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      ClientContact contact = db.ClientPersons.Include("Person") 
            .Where(x => x.ClientPersonId == model.ClientPersonId) 
            .SingleOrDefault(); 
      contact.FirstName = model.FirstName; 
      // etc 
      db.Entry(contact).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(model); 
    } 

Xem http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/ cho một cách tiếp cận tuyệt vời để sử dụng ViewModels trong MVC.

Ngoài ra, tôi thực sự khuyên bạn không nên thực hiện bất kỳ quyền truy cập dữ liệu nào trong ViewModel của mình. Làm điều đó trong Bộ điều khiển của bạn, hoặc thậm chí tốt hơn, trong một Kho lưu trữ được sử dụng bởi Bộ điều khiển của bạn. Mô hình ràng buộc không chơi tốt với các mô hình có logic (tức là chúng không nên chứa bất cứ điều gì nhiều hơn các thuộc tính get/set đơn giản).

+0

Tôi sẽ làm như thế nào? Xin lỗi, tôi mới làm quen với điều này. –

+0

Xem câu trả lời cập nhật của tôi. – jrummell

+0

Để rõ ràng, tôi có cần cập nhật mô hình xem của mình dựa trên mã bạn đã viết ở trên không? Cảm ơn bạn đã giúp đỡ. –

1

Bạn cần di chuyển thuộc tính mô hình của mình sang chế độ xem mô hình trong tác vụ GET. Trong hành động POST, hãy lấy các mô hình ban đầu của bạn từ db, cập nhật các mô hình với dữ liệu từ mô hình khung nhìn, và sau đó lưu các thay đổi. Mô hình của bạn về cơ bản là biểu diễn các bảng trong cơ sở dữ liệu của bạn. Mô hình xem của bạn chỉ là những gì được hiển thị trên màn hình.

[HttpPost] 
    public ActionResult Edit(ClientContactViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 

      var client = db.Client.Where(c => c.Id = model.ClientPersonId); 
      client.FirstName = model.FirstName; 

      ...etc through all your properties and other models... 


      db.Entry(model).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(model); 
    } 

Có nhiều cách để làm điều này, nhưng điều này thể hiện ý tưởng không trừu tượng.

Các vấn đề liên quan