2011-02-06 4 views
3

Ok、Phil Haackのarticleをリストにバインドして読みました。しかし、私はマスターレコードからそれをやっているときに詰まっている。私はこのオブジェクトのために本当に簡単なフォームを持っているMVC 3マスター/ディテールUpdateModelは、既存のレコードを更新する代わりに、新しいディテールレコードを挿入します。

public class Master 
{ 
    public int ID { get; set; } 
    public string MasterTitle { get; set; } 
    public virtual IList<Detail> Details { get; set; } 
} 

public class Detail 
{ 
    public int ID { get; set; } 
    public string DetailName { get; set; } 
    public virtual Master Master { get; set; } 
} 

フォームコレクションが期待プレフィックスと戻ってくる:

[0] "" 
    [1] "ID"  
    [2] "MasterTitle" 
    [3] "Details[0].ID" 
    [4] "Details[0]"  
    [5] "Details" 
    [6] "Details[0].DetailName" 
    [7] "Details[1].ID" 
    [8] "Details[1]"  
    [9] "Details[1].DetailName" string 

とController.UpdateModel(マスター)が結合すべてプロパティを正しく。しかし、私はdbContext.SaveChangesを呼び出すときには、SQLプロファイラ(擬似コード)からのフォローのSQLを発行

update detail1 set masterID = null 
update detail2 set masterID = null 
update master set masterName = 'newname' 
insert detail1 ... 
insert detail2 ... 

私は動作しますが、それはかなりハックだと私は現在、それほどのキーを一致しないよ周りの仕事を持っています正しい順序で戻るすべてに依存しています。また、私は更新したいすべてのフィールドを含める必要があります。

public ActionResult Edit(FormCollection collection) 
    { 
     try 
     { 
      using (var ctx = new PlayContext()) 
      { 
       var id = int.Parse(collection["ID"]); 
       Master master = ctx.Master.Find(id); 

       UpdateModel(master, new [] {"MasterTitle"}); 
       for (int i = 0; i < master.details.Count; i++) 
       { 
        UpdateModel(master.details[i], "Details[" + i + "]", new[] { "DetailName" }); 
       } 

       ctx.SaveChanges(); 
       return View(master); 
      } 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError("", e); 
     } 
     return View(); 
    } 

私は、UpdateModelが何らかの形で子供を削除して再追加しているような気がします。

他に誰かがこれを稼働させていますか?もちろん、私はタオルを投げ込み、インデックスされたフィールド名を自分で解析することができますが、私はとても近いです!

+0

UpdateModelには何がありますか? –

+0

UpdateModelがベースコントローラクラスにあります – DanielEli

答えて

1

MVC2で同様のコードに問題はありませんでした。

でも、私はこのライン心配: [5]「詳細」

それは細部に何を送り返すのですか? MVC 3でモデルバインダーがどのように動作するのかは完全にはわかりませんが、この行によってDetailsコレクションがNULLに設定されることが予想されます。

特定の順序で返されるフィールドに頼る必要はありません。バインダーは、任意の順序でそれらを処理するように設計されています。

関連する問題