Created
June 12, 2011 11:23
-
-
Save ahall/1021457 to your computer and use it in GitHub Desktop.
Pagination
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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