如何在视图中公开多个列表模型

时间:2014-07-23 21:05:55

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

我有一个模型,它将较小的模型作为列表:

  public class MostPlayedList
{
    public IList<MostPlayed> mostPlayed = new List<MostPlayed>();
    public IList<SongNominator> songNominator = new List<SongNominator>();
    public IList<MostUpvoted> songsUpvoted = new List<MostUpvoted>();
    public IList<MostUpvoting> userUpvoting = new List<MostUpvoting>();
}

其他模型是混合视图模型,其中包含与视图相关的信息。现在,我使用以下示例在控件中填充这些列表:

 MostPlayedList s = new MostPlayedList();
var mostPlayed = db.Songs.OrderBy(n => n.timesPlayed).ToList().Take(5);

然后对于找到的每个项目,我添加到IList,在这种情况下是MostPlayed IList:

 //most played songs
        foreach (var item in mostPlayed)
        {
            s.mostPlayed.Add(new MostPlayed() { name = item.name, timePlayed = item.timesPlayed });
        }

我为其他列表项执行此操作,然后将其传递到部分视图中,如下所示:

 return PartialView(s);

我遇到的问题是如何查看,如何向下钻取并公开相关的列表项?我尝试在局部视图中使用它:

@model IEnumerable<JayVumic.Models.MostPlayedList>

然后使用每个:

@foreach (var item in Model.) {

但这似乎不起作用,揭示此模型并循环遍历给定IList数据的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您想单独处理每个列表,您应该执行Dmitry在评论中建议的内容。创建4个foreach循环并显示每个集合必须显示的内容。

@foreach (var item in Model.mostPlayed ) {
...
}
@foreach (var item in Model.songNominator ) {
...
}
@foreach (var item in Model.songsUpvoted ) {
...
}
@foreach (var item in Model.userUpvoting ) {
...
}

然而,如果您的小型号共享相同的部件,并且您希望对它们进行相同的处理,(它们似乎没有,但将其视为未来的有趣事实)您可以从中提取公共接口。你可以使MostPlayedList实现IEnumerable并返回concated列表。在模型上只能使用一个foreach循环。

public class MostPlayedList : IEnumerable<YourCommonInteface>
{
    public IList<MostPlayed> mostPlayed = new List<MostPlayed>();
    public IList<SongNominator> songNominator = new List<SongNominator>();
    public IList<MostUpvoted> songsUpvoted = new List<MostUpvoted>();
    public IList<MostUpvoting> userUpvoting = new List<MostUpvoting>();

    public IEnumerator<YourCommonInteface> GetEnumerator()
    {
        return mostPlayed.Concat(songNominator).Concat(songsUpvoted).Concat();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}