ViewModel有两个列表,如何在视图中将一个内容过滤到不同的无序列表中?

时间:2017-10-31 18:00:01

标签: asp.net-mvc

我想首先对这个措辞不好的问题道歉,如果之前已经回答了这个或类似的问题,但是我花了整整一天的时间和昨天的大部分时间寻找答案而没有运气所以希望这没关系。

我是MVC的完全新手(对于一般的编程很新),我正在制作一个“电视指南”网站,目前有硬编码的时间表等,只是为了获得设计和适当的地方以及学习MVC。在我的索引页面上,我将列出每个节目,每个频道划分,因此我在我的控制器中有这个。 (试图只显示最相关的部分)

public ActionResult Index()
    {                       
        List<ChannelVM> channelList = db.Channel.Select(x => new ChannelVM
        {
            Id = x.Id,
            Name = x.Name,
            ...
        }).ToList();

        List<ScheduleVM> scheduleList = db.Schedule.Select(x => new ScheduleVM
        {
            ...
            ChannelId = x.ChannelId,
            ChannelName = x.Channel.Name,
            ...
        }).ToList();           

        var indexModel = new IndexVM
        {
            ChannelList = channelList,
            ScheduleList = scheduleList
        };                       

        return View(indexModel);
    }

在我看来,我有:

@model DagensTV.Models.ViewModels.IndexVM

...

@if (Model != null)
{
    foreach (var item in Model.ChannelList)
    {
        ...

            <ul>
                @foreach (var show in Model.ScheduleList)
                {
                    <li>
                        ...

                    </li>
                }
            </ul>
        ...
    }
}

目前,只有4个频道使用本地数据库中的数据进行硬编码。 Schedule是包含我想要显示的所有信息的表,它包含Channel,ChannelId的外键。使用上面显示的代码,它会在视图上创建4个无序列表,并使用徽标等正确填充Model.ChannelList中的部分,但在实际计划中,我当然会为每个频道列出所有内容。我通过在视图中进行更改来“解决它”,如下所示:

@foreach (var show in Model.ScheduleList.Where(x => x.ChannelName == item.Name))

然而,这并不是我满意的解决方案,因为我一遍又一遍地被告知在视图中避免使用那种代码,并在控制器中执行所有操作。

在控制器中我尝试添加一些lambda来“过滤”类似于上面的解决方案的东西,但是无济于事。

我现在不知道如何继续进行所以我的问题是,如何过滤scheduleList,以便ChannelID为1的节目转到视图中的一个无序列表,ChannelID为2的节目去另一个等?任何帮助都非常感谢,即使它只是在正确的方向推动。 :)

1 个答案:

答案 0 :(得分:0)

您可以在ChannelViewModel中拥有一个属性来保存频道的Schedule,然后通过控制器操作,您可以使用Channel Schedules返回每个频道ChannelVM填充,然后你只需要循环遍历那些。

您的public class ChannelVM { public int Id {get;set;} public string Name {get;set;} ...... ...... public List<ScheduleVM> Schedules {get;set;} } 需要像:

List<ChannelVM> channelList = db.Channel.Select(x => new ChannelVM
{
    Id = x.Id,
    Name = x.Name,
    Schedules = db.Schedule.Where(s=>s.ChannelId == x.Id)
                              .Select(schedule => new ScheduleVM
                                {


                                  ...
                                }).ToList();

这将是:

foreach (var item in Model.ChannelList)
{
    ...

    <ul>
        @foreach (var show in item.ScheduleList)
        {
            <li>
               ...

            </li>
        }
    </ul>
    ...
}

现在在你看来你会做类似的事情:

Compare(this byte[]

注意:这只是为了让您了解如何执行此操作,您需要调整ViewModel才能使其正常工作。

希望它有所帮助!