在MVC Razor视图中按月分组

本文关键字:MVC Razor 视图 | 更新日期: 2023-09-27 18:24:52

我有一个mvc剃刀视图,它有一个这样填充的模型:

public class HomeController : Controller
    {
        private IDataSource _db;
        public HomeController (IDataSource db)
        {
            _db = db;
        }

        public ActionResult Events()
        {
            var allevents = _db.Events;
            ViewBag.Title = "Events";
            return View(allevents);
        }

    }

事件模型如下所示:

 public class Event
    {
        public virtual int Id { get; set; }
        public virtual string Title { get; set; }
        public virtual string Description { get; set; }
        public virtual Location Location {get;set;}
        public virtual DateTime StartDate {get;set;}
        public virtual DateTime EndDate { get; set; }
    }

我希望在视图中显示这些项目,以便按月份名称对它们进行分组。例如:

十月

EventA标题、EventA描述等

事件B标题、事件A描述等

11月

事件C标题、事件C描述等

如果可能的话,你可以更进一步,在一年前,然后在一个月内爆发,但这并不完全必要,因为我不认为会提前一年以上进入活动。

我已经在我的剃刀视图中尝试过这个,但似乎有点偏离…

@{var monthList = from e in Model
group e by e.StartDate.Month into g
orderby g.Key
select g;
foreach(var monthGroup in monthList)
{
    string month = monthGroup.Key.ToString();
<h2 class="h4 pi-weight-700 pi-uppercase pi-has-bg pi-margin-bottom-25">
    @month
</h2>
    foreach (Model e in monthGroup)
    {
        // do something with the events
    }
}}

在MVC Razor视图中按月分组

假设开始日期和结束日期在同一个月,我会做如下操作(在控制器中):

var groupedEvents = _db.Events.ToList().GroupBy(k => new DateTime(k.StartDate.Year, k.StartDate.Month, 1)).OrderBy(k => k.Key).ToDictionary(k => k.Key, v => v.ToList());
return View(groupedEvents);

然后在视图中浏览foreach的字典。您可以通过以下方式获取月份名称:

@model IDictionary<DateTime, List<Event>>
@foreach(var item in Model)
{
     //Display month name
     <h1>@item.Key.ToString("MMM", CultureInfo.InvariantCulture);</h1>
     foreach(var ev in item.Value)
     {
         //Row specific code
     }
}