【问题标题】:Group by Month in a MVC Razor view在 MVC Razor 视图中按月分组
【发布时间】:2014-11-21 14:07:28
【问题描述】:

我有一个 mvc razor 视图,它的模型填充如下:

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; }
    }

我想在我的视图中显示这些项目,以便它们按月份名称分组。例如:

10 月

EventA 标题、EventA 描述等

EventB 标题、EventA 描述等

11 月

EventC 标题、EventC 描述等

如果可能的话,您可以更进一步,将其按年划分,然后按月划分,但这不是完全必要的,因为我看不到事件会提前一年多进入的情况。

我已经在我的剃刀视图中尝试过这个,但似乎有点不对劲......

@{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
    }
}}

【问题讨论】:

  • 这应该在控制器中完成,是 _db.Events IQueryable 吗?如果是这样,请使用 LINQ 对它们进行分组。
  • 您的_db 可能返回IEnumerableIQueryble 对象。只需在您的模型上调用GroupBy,然后调用ToDictionary。这里有很多例子。喜欢this one
  • 言归正传,你试过什么?
  • 如果您有事件 A:开始日期 - 2014 年 1 月 1 日;结束日期 - 2014 年 9 月 1 日。事件 B:开始日期 - 2014 年 3 月 1 日;结束日期 - 2014 年 8 月 1 日。您希望如何显示它们?
  • 抱歉,对 MVC 和 LINQ 来说非常陌生。用我尝试过的方法更新了我的问题。

标签: c# asp.net-mvc-4 razor


【解决方案1】:

假设开始日期和结束日期在同一个月,我会做类似的事情(在控制器中):

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);

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

@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
     }
}

【讨论】:

  • 不应该是foreach(var item in **model**吗?我可能会建议使用与 model 不同的变量,例如 eventsByMonth 等,以解决刚刚发生的确切混淆。
  • 按月和年分组,因为我假设您可能有跨年边界的事件。如果您创建了 MyObject 类,您还可以使用 new MyObject { Year = k.StartDate.Year, Month = k.StartDate.Month } 而不是日期时间(没有使用匿名类型,因此您可以拥有强类型视图型号)。
  • 很公平,我会澄清
  • 出现错误:LINQ to Entities 中仅支持无参数构造函数和初始化程序
  • 抱歉,现在试试(使用额外的 ToList() 调用)。
猜你喜欢
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多