1

我是 MVC / Razor 的新手,我需要一些指导。我正在尝试创建从 MongoDB 数据库中检索日期的培训日历。我在下面的解决方案有效,但是看着它,我知道它可以更有效地完成,并且想要一些指针。

这是我页面上的一个 div 的代码,它是一个月中的一天......我在一个页面上有四个月。Model.TrainingDays是一个List<TrainingEvent> TEvent。实例具有TrainingEvent以下属性:

string CssClass
string EventName

这是我的剃刀代码(_day我们正在渲染的月份中的哪一天:

<div class="day">
    <div class="dayBox">@_dayNumber.ToString("00") <span class="black">@_day.ToString("ddd")</span></div>

    @foreach (var item in Model.TrainingDays)
    {
        if (_day.Date == item.Date.Date)
        {
            string eventCls = "eDay " + item.TEvent.CssClass;
            <div class="@eventCls">@item.TEvent.EventName</div>
            break;
        }
    }
</div>

如果日期与我们TrainingEvent所在的当前_daydiv 匹配,则添加 Event。如果我有很多事件,foreach 循环并不是最好的方法。我应该怎么做?这也是我的第一篇文章,所以任何关于我如何提出问题的建议都值得赞赏。非常感谢!蒂姆

4

2 回答 2

3

尝试这样的事情:

<div class="day">
    <div class="dayBox">@_dayNumber.ToString("00") <span class="black">@_day.ToString("ddd")</span></div>

    @foreach (var item in Model.TrainingDays.Where( td => td.Date.Date == _day.Date ))
    {
            string eventCls = "eDay " + item.TEvent.CssClass;
            <div class="@eventCls">@item.TEvent.EventName</div>
            break;
    }
</div>
于 2012-05-09T13:03:43.483 回答
1

您可以按日期对 TrainingDays 进行分组,然后如果您真的担心性能下降,则将它们转换为字典。我不确定它的 Razor 语法,但你可以在普通的 C# 中执行此操作:

var trainingDaysByDay = Model.TrainingDays
    .GroupBy(td => td.Date.Date)
    .ToDictionary(g => g.Key);

然后,您可以通过以下方式查找当天的项目:

foreach(var item in trainingDaysByDay[_day.Date])
{
    //...
}

这样,您只需遍历整个 TrainingDays 集合一次,并且每天您只接触您需要的特定对象。但是,除非您拥有庞大的数据集,否则差异将可以忽略不计。

于 2012-05-09T13:12:28.167 回答