2013-08-06 21 views
0

我需要为通知列表制作一个分页系统,实质上应该按月分割通知列表。 这是我的通知查看模式:Mvc使用月份代替页码的分页系统

public class IndexViewModel 
{ 
    public string Template { get; set; } 
    public DateTime Created { get; set; } 
} 

这是对应的视图:

@model IEnumerable<IndexViewModel> 
@{ 
    ViewBag.Title = "List"; 
    Layout = "~/Views/Shared/_LayoutAdmin.cshtml"; 

    var now = DateTime.Now; 
    } 

<link href="@Url.Content("~/Resources/styles/Notifications/NotificationsPage.css")" rel="stylesheet" /> 

    @foreach (IndexViewModel item in Model) 
    { 
    <div> 
     @Html.Raw(item.Template) 
    </div> 
    } 

我需要一个非常简单的解决方案。任何想法非常感谢。

这是返回我的视图模型

public List<IndexViewModel> GetIndexViewModel(int? month, int? year)//(DateTime? entryDate) 
    { 
     //List<string> templates = GetRenderTemplates(true); 

     //Tuple<template, Created, ImportanceId> 
     List<Tuple<string, DateTime, int>> templates = GetTemplatesWithDateAndImportance(true); 
     templates = templates.OrderBy(f => f.Item3).ThenByDescending(f => f.Item2).Select(f => f).ToList(); 

     if (month != null && year != null) 
      templates = templates.Where(f => f.Item2.Month == month && f.Item2.Year == year).ToList(); 

     List<IndexViewModel> toRet = new List<IndexViewModel>(); 

     foreach (Tuple<string, DateTime, int> template in templates) 
     { 
      toRet.Add(new IndexViewModel() { 
       Template = template.Item1, 
       Created = template.Item2 
      }); 
     } 

     return toRet; 
    } 

服务法这是我的行动:

[ActionName("List")] 
    public ActionResult UsersList(int? month, int? year) 
    { 
     List<IndexViewModel> responseModel = Service.GetIndexViewModel(month, year);        

     return View(responseModel); 
    } 
+0

究竟是什么问题?你有什么尝试?你的数据库提供者是什么? –

+0

@TheodorosChatzigiannakis,我的问题是如何制作一个使用月份名称而不是页码的分页系统。我的数据库提供者是MySQL。我试图根据月份和年份做出返回通知模板的操作。 –

+0

在演示文稿上,您可以使用'CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(monthNumber);'来表示从号码 – Daniele

回答

0

你可能只是这样做:

var filteredNotifications = Model.Where(x => x.Created.Month == selectedTime.Month && x.Created.Year == selectedTime.Year); 

或者(如果你”他们正在排序):

var filteredNotifications = Model.SkipWhile(x => x.Created.Month != selectedTime.Month || x.Created.Year != selectedTime.Year).TakeWhile(x => x.Created.Month == selectedTime.Month && x.Created.Year == selectedTime.Year); 

随着selectedTime是一个DateTimeselectedTime.Month将是一个默认的月份(可能now.Month,如果没有所需的值已被suppled)或所选月份(如果期望的值已经被提供)。月份的期望值很可能是路线值。 selectedTime.Year也是如此。

你也可以有一个通过链接到同一页面的prevTime.MonthprevTime.Year路线值引起下一轮与前几个月链接(其中var prevTime = selectedTime.AddMonths(-1))或nextTime.MonthnextTime.Year(其中var nextTime = selectedTime.AddMonths(1))。

+0

转换的月份名称您的想法非常好,但如果按(例如)会发生什么?以前您必须更改年份, ?如何通过一年的新价值而不是破坏功能? –

+0

我添加了一些代码来防止我在我的评论中解释的情况。 –

+1

@OctavianEpure如果'selectedTime'是'DateTime',那么'AddMonths'方法将负责改变年份。无论如何,你必须将月份和年份作为路由值。我建议你在action方法中将它们作为单独的参数传递,因为我不确定它们是否可以由框架作为DateTime结构来解析。 –