2011-02-16 40 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