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が何らかの形で子供を削除して再追加しているような気がします。
他に誰かがこれを稼働させていますか?もちろん、私はタオルを投げ込み、インデックスされたフィールド名を自分で解析することができますが、私はとても近いです!
UpdateModelには何がありますか? –
UpdateModelがベースコントローラクラスにあります – DanielEli