我正在开发一个ASP.NET MVC项目。在我的项目中,我需要实现分页功能。所以我使用PagedList.Mvc。我安装了它运行这个命令," install-package PagedList.Mvc"在包管理器控制台中。我知道如何使用它实现分页。但我遇到了实现匿名类型视图集合的问题。请参阅下面的方案。
这是我实施分页逻辑的行动方法
public ActionResult IpList(int page = 1)
{
List<IpVisitInfo> ipVisitList = new List<IpVisitInfo>();
var rawVisits = trackTool.Visitors.GroupBy(x => x.IpAddress).Select(x => new { Visitors = x.Count(), IpAddress = x.Key, LastVisitedTime = x.OrderByDescending(c => c.Id).FirstOrDefault().VisitedAt }).ToPagedList(page,PageSize);
if(rawVisits!=null && rawVisits.Count()>0)
{
foreach(var visit in rawVisits)
{
IpVisitInfo info = new IpVisitInfo
{
IpAddress = visit.IpAddress,
LastVisitedAt = visit.LastVisitedTime,
TotalVisitors = visit.Visitors
};
ipVisitList.Add(info);
}
}
IpVisitListVM model = new IpVisitListVM
{
IpList = ipVisitList
};
return View(model);
}
正如您所看到的,我检索了匿名类型集合,然后遍历它并分配给强类型集合。我在匿名类型集合上调用了ToPagedList(PageNumber,PageSize)。但问题是在视图中实现分页所需的所有数据都是匿名类型集合。在视图中,分页必须如下所示。
@Html.PagedListPager(Model.Items, page => Url.Action("List", new { page }))
这是我的视图模型
public class IpVisitListVM
{
public IEnumerable<IpVisitInfo> IpList { get; set; }
}
所以根据我正在做的事情,我的视图模型的IpList没有必要的数据来呈现分页。如果我在不使用ToPagedList()的情况下检索所有匿名收集拳头,然后遍历每个记录,性能将非常慢,因为它首先从数据库检索所有记录。我会有这么多的记录。如何在匿名类型视图上使用PagedList并传递给强类型视图以实现分页?
在视图模型中,我正在使用此属性
IEnumerable<IpVisitInfo> IpList
而不是这个
IPagedList<IpVisitInfo> IpList
因为它没有足够的数据来创建分页。因为我过滤了行动。
但是如果我可以通过以下列表
trackTool.Visitors.GroupBy(x => x.IpAddress).Select(x => new { Visitors = x.Count(), IpAddress = x.Key, LastVisitedTime = x.OrderByDescending(c => c.Id).FirstOrDefault().VisitedAt }).ToPagedList(page,PageSize);
分页完美创造,性能更好。有没有办法通过该清单?