2011-02-06 60 views
3

好吧,我已閱讀Phil Haack的article關於綁定到列表,我在一個視圖上工作得很好。但是當我把它從主記錄中刪除時,我被卡住了。MVC 3 Master/Detail 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 ... 

我有一個變通的作品,但它是相當hackish的,我目前不匹配了鍵,以便它依賴於以正確順序返回的所有內容。另外我必須包括所有我想更新的字段。

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? – 2011-04-28 14:29:49

回答

1

它應該工作 - 我沒有任何問題與MVC2類似的代碼。

我很擔心這條線,但: [5]「詳細信息」

什麼是它的詳細資料發送回?我期望這可能會導致問題 - 不完全確定模型綁定器如何在MVC 3中工作,但我希望這行會導致它將Details集合設置爲NULL。

您不應該依賴以特定順序返回的字段 - 活頁夾將被設計爲以任何順序處理它們。

相關問題