2012-06-25 11 views
5

私は、1つのビューモデルを作成するために一緒に来ている3つのモデルを持っていて、私は "編集"をクリックするとそのビューモデルを編集できるようにしたいと思います。私はこれがどのように(どこでも)どのように働くかのまっすぐな例を見つけることができません。MVC3の編集ページからビューモデルを更新するにはどうすればよいですか?

私は正しい道を行くかどうか分かりません。私はそのデータを見ることができます。この時点で、私はそれを保存することができません。

ご協力いただければ幸いです。

ありがとうございます!

モデル:

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

} 

ビューモデル:

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; 

     } 
    } 



} 

コントローラー:

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

私はdb.Entry(モデル).Stateでエラーが出ます... "エンティティタイプClientContactViewModelは、現在のコンテキストのモデルの一部ではありません。

答えて

9

あなたのViewModelはエンティティではありません。 ViewModelをエンティティにマップし、エンティティの状態をmodifiedに設定する必要があります。

基本的には、ビューモデル値でエンティティ値を設定する必要があります。あなたはAutoMapperを使用するか、手動でそれを処理することができます

[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を使用して優れたアプローチをhttp://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/を参照してください。

また、ViewModelでデータアクセスを行わないことを強くお勧めします。コントローラで使用するリポジトリ、またはコントローラで使用するリポジトリで行う方がよいでしょう。モデルバインディングは、ロジックを持つモデルではうまくいかない(つまり、単純なget/setプロパティ以外のものを含むべきではない)。

+0

どうすればいいですか?申し訳ありませんが、私はこれに新しいです。 –

+0

私の更新された回答を参照してください。 – jrummell

+0

明確にするには、上に書いたコードに基づいてビューモデルを更新する必要がありますか?ご協力いただきありがとうございます。 –

1

GETアクションでモデルのプロパティをビューモデルに移動する必要があります。 POSTアクションでは、元のモデルをdbから取得し、ビューモデルのデータでモデルを更新してから変更を保存します。あなたのモデルは、基本的にあなたのデータベース内のテーブルの表現です。あなたのビューモデルは画面に表示されているものだけです。

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

これを行うにはよりスッキリな方法がありますが、これは抽象的な概念がないことを表しています。

関連する問題