我是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
的日期与我们所在的当前_day
div匹配,请添加事件。如果我有很多事件,foreach循环不是最好的方法。
我应该如何 这样做?这也是我的第一篇帖子,所以对我如何提出这个问题的任何建议都表示赞赏。
非常感谢!
蒂姆
答案 0 :(得分: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>
答案 1 :(得分: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集合一次,并且每天只触摸您需要的特定对象。但是,除非您拥有庞大的数据集,否则差异可以忽略不计。