2012-06-25 27 views
5

Tek bir görünüm modeli oluşturmak için bir araya gelen üç modelim var ve "düzenle" yi tıklattığınızda bu görünüm modelini düzenleyebilmek istiyorum. Bunun nasıl çalıştığını (herhangi bir yerde) doğru bir örnek bulamıyorum.MVC3'teki düzenleme sayfasındaki görünüm modelini nasıl güncellerim?

Doğru yoldan aşağı gidiyorum emin değilim. Görünümü veri ile elde edebiliyorum. Bu noktada, onu kaydedemiyorum.

Herhangi bir yardım için teşekkür ederiz.

Teşekkürler!

Modeller:

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;} 

} 

Görünüm Modeli:

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; 

     } 
    } 



} 

Denetleyici:

   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); 
     } 
} 

Ben db.Entry (modele) bir hata alıyorum .State ... " Varlık türü ClientContactViewModel, geçerli içerik için modelin bir parçası değildir. "

cevap

9

ViewModel'ınız bir varlık değildir. ViewModel'inizi kendi varlığınızla eşleştirmeli, ardından varlığın durumunu değiştirilecek şekilde ayarlamanız gerekir.

Temel olarak, bu, varlık değerlerinizi görünüm modeli değerlerinizle ayarlamanız gerektiği anlamına gelir. Sen AutoMapper kullanabilir veya manuel olarak işleyebilir:

[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); 
    } 

MVC ViewModels kullanarak için mükemmel bir yaklaşım için http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/ bakınız.

Ayrıca, ViewModel'inize herhangi bir veri girişi yapmamanızı şiddetle tavsiye ederim. Kontrolörünüzde veya daha iyi bir şekilde, Kontrolörünüz tarafından kullanılan bir Depoda yapın. Model bağlama, mantığı olan modellerle (yani, basit get/set özelliklerinden daha fazlasını içermemelidir) iyi sonuç vermez.

+0

Bunu yapmayı nasıl yaparım? Üzgünüm, buna yeniyim. –

+0

Güncellenmiş yanıtımı görün. – jrummell

+0

Açık olmak gerekirse, benim görünüm modelimi yukarıda yazdığınız koda göre güncellemem gerekiyor mu? Yardım ettiğin için teşekkür ederim. –

1

Modellerinizin özelliklerini GET eylemindeki viewmodel'e taşımanız gerekir. POST eyleminde, orijinal modellerinizi db'den alın, modelleri modelden veriyle güncelleyin ve ardından değişiklikleri kaydedin. Modelleriniz aslında veritabanınızdaki tabloların temsilidir. Görünüm modeliniz ekranda gösterilen şeydir.

[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); 
    } 

Bunu yapmak için daha net yollar vardır, ancak bu, soyutlama olmadan fikri temsil eder.

İlgili konular