2014-09-26 50 views
1

我有了一個模型填充像這樣一個MVC Razor視圖:集團按月在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; } 
    } 

我想在我的視圖中顯示項目,以便按月份名稱進行分組。例如:

EventA標題,EventA說明等

EventB標題,EventA說明等

EventC標題,EventC說明等。

如果p可能你可以進一步把它打破一年,然後一個月,但不是完全必要的,因爲我沒有看到事件將提前一年多的情況。

我在Razor視圖試過,但似乎稍微偏離...

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

這應該在控制器中完成,是_db.Events IQueryable?如果是這樣,請使用一點LINQ來對它們進行分組。 – 2014-09-26 14:15:23

+0

你的_db可能返回一個IEnumerable或IQueryble對象。只需在您的模型上調用'GroupBy',然後調用'ToDictionary'。這裏有很多例子。像[這一個](http://stackoverflow.com/questions/627867/linq-query-to-return-a-dictionarystring-string)。 – 2014-09-26 14:15:49

+0

更重要的是,你有什麼嘗試? – 2014-09-26 14:16:39

回答

4

假設開始日期和結束日期都在同一個月,我會做這樣的事情(在控制器):

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 
    } 
} 
+0

不應該是'foreach(**模型**中的var項目?)我可能會推薦使用與'model'不同的變量,比如'eventsByMonth'等等,以確實發生混亂。 – 2014-09-26 14:27:59

+0

按月分組假設你創建了一個MyObject類,你也可以使用新的MyObject {Year = k.StartDate.Year,Month = k.StartDate.Month}而不是日期時間(沒有使用匿名類型,所以你可以有一個強類型的視圖模型) – rashleighp 2014-09-26 14:28:31

+0

公平的,我會澄清 – rashleighp 2014-09-26 14:28:48