如何显示链接到父模型的子模型列表的编辑器?

时间:2015-02-27 14:02:59

标签: c# asp.net-mvc entity-framework asp.net-mvc-5

我通过EF设置了以下模型关系:

public class Purpose
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Purpose> Purposes { get; set; }
}

我的目的是在数据库中预先定义的,一个Item可以有很多Purposes(想到它们几乎就像“标签”)。用户无法在Purpose编辑器中添加新的Item,他们只能从已有的编辑器中进行选择。

我是MVC的新手,正在尝试为我的Item课程创建CRUD操作。我支持我的EF模型,因此我有基础知识(例如,它允许我编辑Name属性,因为这是一个简单的属性),但它没有支持更复杂的关系。

我正在寻找的是,在编辑视图中,列出了列出数据库中每个Purpose的复选框,当选中一个或多个复选框时,它会将它们添加到List<Purpose> Item班级的关系。这就是我在Item.cshtml视图中的内容:

@Html.EditorFor(model => model.Purposes)

我创建了一个Views / Shared / EditorTemplates / Purpose.cshtml编辑器模板,但我不确定我应该放入什么或者它最终如何链接到我的主Item视图

1 个答案:

答案 0 :(得分:1)

查看模特是你的朋友。包含一个布尔属性以指示所选的Purpose个对象

public class PurposeVM
{
  public int Id { get; set; }
  public string Name { get; set; }
  public bool IsSelected { get; set; }
}

public class ItemVM
{
  public int Id { get; set; } // only required for an edit view model
  [Required]
  public string Name { get; set; }
  public List<PurposeVM> Purposes { get; set; }

}

控制器

public ActionResult Create()
{
  ItemVM model = new ItemVM();
  // map all purposes from database, for example
  model.Purposes = db.Purposes.Select(p => new PurposeVM()
  {
    Id = p.Id,
    Name = p.Name
  });
  return View(model);
}

[HttpPost]
public ActionResult Create(ItemVM model)
{
}

查看

@model ItemVM
@using(Html.BeinForm())
{
  @Html.LabelFor(m => m.Name)
  @Html.TextBoxFor(m => m.Name)
  @Html.ValidationMessageFor(m => m.Name)
  for(int i = 0; i < Model.Purposes.Count;i++)
  {
    @Html.CheckBoxFor(m => m.Purposes[i].IsSelected)
    @Html.LabelFor(m => m.Purposes[i].IsSelected, Model.Purposes[i].Name)
    @Html.HiddenFor(m => m.Purposes[i].Id) // plus hidden input for name if you want to post that as well
  }
  <input type="submit" />
}
相关问题