如何显示嵌套列表并维护MVC模式?

时间:2016-04-14 20:15:59

标签: asp.net-mvc entity-framework

尝试使用MVC 6和EF代码首次设计显示嵌套列表。我使用这个Tutorial让我开始使用MVC并尝试将其带到另一个层次。

类:

public class Location
{
    [Key]
    public int ID { get; set; }
    public string LocationName { get; set; }
    public ICollection<SubLocation> Sublocations { get; set; }
    }
}

public class SubLocation
{
    public int ID { get; set; }
    public string SubLocationName { get; set; }
}

正在运行dnx ef database update正确设置我的EF数据库并在LocationID下为SubLocation分配一个外键。

enter image description here

现在我想在每个位置下显示子位置,如下图所示。用户可以添加与位置关联的新位置或子位置。

enter image description here

显示位置列表很简单:return View(_context.Location.ToList());

要显示嵌套的子位置列表,我应该在控制器或视图中进行工作吗?

我希望我可以像以下一样使用视图,但item.Sublocationsnull,原因是我不确定,因为数据库中有数据。:

@foreach (var item in Model) {
  <tr>
    <td>@Html.DisplayFor(modelItem => item.LocationName)</td>
  </tr>

  @foreach (SubLocation itm in item.Sublocations)
  {
    <tr>
        <td>@itm.SubLocationName</td>
    </tr>
  }
}

我已尝试在控制器中创建查询,但外键无法与之比较。

var test = (from m in _context.SubLocation
            where m.LocationID == curLocID   <-- m.LocationID isn't available
            select m.SubLocationName
            ).ToList();  

即使我可以使用LocationID,我也不确定如何将当前位置(curLocID)从View发送回控制器。我想我需要一个辅助方法,但我开始进入圈内。

如何维护适当的MVC并显示主类的子类中的嵌套列表?

1 个答案:

答案 0 :(得分:1)

您应该考虑在LocationID类中添加SubLocation属性,该属性将是Location表的外键。

public class SubLocation
{
    public int ID { get; set; }
    public string SubLocationName { get; set; }
    public int LocationID { set;get;}
}

现在,查询位置。位置具有SubLocations属性,因此您的视图应该可以正常工作。

var locations = _context.Locations.Include(s=>s.SubLocations).ToList();
return View(locations);