3

わかりました、リストへのバインドに関するPhil Haack の記事を読みましたが、1 つのビューで問題なく動作しています。しかし、マスターレコードからそれを行うときに私が立ち往生していること。

このオブジェクトの非常に単純なフォームがあります

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(master) はすべてのプロパティを正しくバインドします。しかし、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 がどういうわけか子を削除して再追加しているように感じます。

他の誰かがこれを機能させましたか?もちろん、タオルを投げてインデックス付きフィールド名を自分で解析することもできますが、非常に近いです!

4

1 に答える 1

1

動作するはずです - MVC2 の同様のコードで問題はありませんでした。

この行が気になります:[5]「詳細」

詳細は何を送り返していますか?これが問題を引き起こしている可能性があると思います-MVC 3でモデルバインダーがどのように機能するかは完全にはわかりませんが、この行により Details コレクションが NULL に設定されると思います.

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

于 2011-11-14T09:40:49.410 に答える