Skip to content

Instantly share code, notes, and snippets.

@ahall
Created June 12, 2011 11:23
Show Gist options
  • Save ahall/1021457 to your computer and use it in GitHub Desktop.
Save ahall/1021457 to your computer and use it in GitHub Desktop.
Pagination
public class PaginatedList<T> : List<T>
{
private int totalItems;
private int totalPages;
public int PageIndex { get; private set; }
public PaginatedList(IQueryable<T> items, int pageIndex, int perPage)
{
PageIndex = pageIndex < 0 ? 0 : pageIndex;
totalItems = items.Count();
totalPages = (int)Math.Ceiling(totalItems / (double)perPage);
this.AddRange(items.Skip(PageIndex * perPage).Take(perPage));
}
public IEnumerable<int?> EnumeratePages(int leftEdge = 2, int leftCurrent = 2,
int rightCurrent = 5, int rightEdge = 2)
{
int last = 0;
for (int pageNum = 1; pageNum < totalPages + 1; ++pageNum)
{
if ((pageNum <= leftEdge) || (pageNum > PageIndex - leftCurrent - 1 && pageNum < PageIndex + rightCurrent) ||
(pageNum > totalPages - rightEdge))
{
if (last + 1 != pageNum)
yield return null;
yield return pageNum;
last = pageNum;
}
}
}
public bool HasNext
{
get
{
return PageIndex < totalPages - 1;
}
}
public MvcHtmlString Render(HtmlHelper helper)
{
StringBuilder builder = new StringBuilder();
builder.Append(@"<div class=""pagination"">");
foreach (int? pageNum in EnumeratePages())
{
if (pageNum.HasValue)
{
int pageIndex = pageNum.Value - 1;
if (pageIndex != PageIndex)
{
helper.ViewContext.RouteData.Values["page"] = pageNum.Value;
builder.Append(helper.RouteLink(pageNum.Value.ToString(), helper.ViewContext.RouteData.Values).ToHtmlString());
}
else
{
builder.AppendFormat("<strong>{0}</strong>", pageNum.Value);
}
}
else
{
builder.Append("<span class=ellipsis>…</span>");
}
}
if (HasNext)
{
helper.ViewContext.RouteData.Values["page"] = PageIndex + 2;
builder.Append(helper.RouteLink("Next", helper.ViewContext.RouteData.Values).ToHtmlString());
}
builder.Append("</div>");
return MvcHtmlString.Create(builder.ToString());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment