2011-02-16 50 views
4

我老老實實地找了一個多小時纔得到滿意的答案。所以並不是我沒有找到答案,只是不是我覺得完全正確的答案。這可能意味着我正在尋找不存在的銀色子彈。ASP MVC - 多對多的關係

在包含多對多關係的EF(代碼優先)模型的asp mvc中,如何將該關係綁定到複選框,然後將這些更改優雅地傳播到我的數據庫。

如果視圖只返回檢查過的複選框的值,那麼我不知道先前檢查過哪些值。我是否再次拉回原始對象然後比較兩者?它感覺骯髒,可能是因爲我習慣於讓EF魔術管理在對象上發生變化的屬性。

我已經有一個骯髒的版本,我不滿意。

[HttpPost] 
    public ActionResult Edit(int id, FormCollection collection) 
    { 
     try 
     { 
      // TODO: Add insert logic here 
      Program p = _programRep.GetByID(id); 

      //manually update properties 
      //change to model binding later 


      EditPolicies(ref p, collection["SelectedPolicies"].ToString().Split(',')); 

      _programRep.Save(p); 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

    private void EditPolicies(ref Program c, string[] selectedvals) 
    { 
     //I could do comparison logic here 
     int count = c.Policies.Count; 
     for (int i = 0; i < count; i++) 
     { 
      c.Policies.Remove(c.Policies.ElementAt(0)); 
     } 

     for (int i = 0; i < selectedvals.Count(); i++) 
     { 
      Policy g = _policyRep.GetByID(int.Parse(selectedvals[i])); 
      c.Policies.Add(g); 
     } 
    } 
+0

真的沒有一種優雅的方式做你想要什麼。我通常做類似於你正在做的事情(刪除現有的,然後添加新的)。 – senfo 2011-02-18 18:39:21

回答

1

我不太清楚你如何期待這個工作,所以我不知道你在找什麼,但這是正確的方式和設計。

有很多建模案例。希望我保存了我發現的鏈接,其中包含從集合中刪除對象的完美示例,意味着缺少關係,而不是需要刪除行。

我想補充的唯一的優雅是這樣的:

c.Policies.AddRange(_policyRep.GetByIDs(selectedvals[i])); 
+0

*嘆* *你是對的。謝謝。我保留了大致相同的控制器代碼,但是自己構建了一些複選框幫助器方法,以使其看起來不那麼痛苦。它最終會獲取項目的主集合和選定項目的列表,通常來自模型並呈現結果。然後我在控制器中運行這個代碼片段。 – Marc 2011-02-23 16:04:09