与许多人合作

时间:2012-03-26 11:07:37

标签: asp.net-mvc-3 entity-framework entity

我正在尝试研究如何使用多对多关系并使用复选框选择此选项并使用EF4.1进行记录。和MVC3。

比方说,我有两个实体:

实体:个人 *-ID -名字 -secondName

实体:设备 *-ID -名称 -高度 -宽度 - 重量

实体Person与实体设备之间的关联是多对多的。

我想在创建人页面中做什么,我想将设备实体/表的内容显示为复选框。在表单提交时,我想创建person实体并存储所选的复选框。

如果有人能告诉我如何实现这一目标,我会很高兴。

2 个答案:

答案 0 :(得分:1)

有几个步骤。

  1. 定义您的实体
  2. 配置ManyToManyRelationship
  3. 构建MVC控制器和视图。
  4. 定义实体对象

    public class Person
    {
        public int Id {get; set;}
    
        /// other fields
    
        public virtual ICollection<Equipment> Equipment { get; set; }
    }
    
    public class Equipment
    {
        public int Id {get; set;}
        public string Name {get;set;}
    
        /// other fields
    
        public virtual ICollection<Person> People { get; set; }
    }
    

    DBContext类

    public MyContext :  DBContext
    {
        DbSet<Person> People { get; set; }
        DbSet<Equipment> Equipment {get; set;}
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Person>()    // configure the many to many relationship.
                .HasMany(m=>m.Equipement)    // not required but I like to be explicit
                .WithMany(m=>m.People).
                .Map(m=>m.MapLeftKey("Person_Id")
                         .MapRightKey("Equipement_Id)
                         .ToTable("PersonEquipment");
        }
    }
    

    我喜欢每个视图使用一个视图模型     公共类CreatePersonViewModel     {         公共人物{get; set;}         public IEnumerable equipment {get; set;}         public int [] selectedEQuipment {get; set;} //这将在帖子中返回     }

    控制器

    public class PersonController: Controller
    {
        public ActionResult CreatePerson()
        {
            using (var db = new MyContext())
            {
                var newPerson = new CreatePersonViewModel
                       {
                           person = new Person(),
                           equipment = db.Equipement.ToList()
                       }
    
                 return View(newPerson)
             }
        }
    }
    

    视图

    我不会做整个视图,但这是非常自我解释。这个网站上有很多例子。关键是设置设备阵列,以便在需要时恢复设备ID。我将使用ASPX作为视图,但您可以使用Razor

    <%
        foreach (var e in Model.Equipement)
        {%>
            <input name="selectedEQuipment" type="checkbox" value=<%: e.Id %> />
            //// display the label for the checkbox anyway you want with whatever markup you need.
        <%}
    %>
    
    ...
    
    <input type="submit" />
    

    关键是您将所有输入命名为相同且名称与ViewModel中的名称相匹配,并且所有这些都在Html.BeginForm()内,包括提交按钮。

    控制器中的Http Post Metnod

       [HttpPost]
       public ActionResult CreatePerson( CreatePersonViewModel viewModel)
        {
            using (var db = new MyContext())
            {
                // either use client side validation or server side validation
    
                db.People.Add(viewModel.person);
                // make sure the Equipment array in the viewModel is not null
                var equipment = from o in db.Equipment where viewModel.selectedEquipment.Contains(o.Id);
                foreach (var e in equipment)
                {
                    viewModel.Equipment.Add(e);
                }
    
                db.SaveSchanges();
                 // go somewhere using Redirect of some sort
             }
        }
    

答案 1 :(得分:0)

我在DARK中捅了一刀。您要求的解决方案没有提供详细信息,所以这里就是..

有很多方法可以解决“我想将设备实体/表格的内容显示为复选框”

有些选项使用网格组件,并在网格中添加一个复选框作为选择。 然后循环通过每个选择的网格。

简单的方法是查询人,我会说只是使用txtboxes然后绑定到字段 绑定设备网格(这将获得相关的设备项目。) 你可以这样做一个查询方法。 传入id

dim q = from Equip in context.equipment
        from Peeps in context.Person
        where peeps.id = id
        select Equip

然后您需要循环搜索结果并使用上面的查询检查您使用的组件中的每个框

(这是我使用的一种技术,还有其他技术) 如果要保存更改。

先保存人员。 然后   我会检查网格上是否有变化,如果是,查询与人相关的设备中的所有现有记录并删除(使用EF Clear方法)所有相关的,然后循环通过装备网格进行所有检查并保存回到设备。这将添加所有更改。 重新绑定网格。