A Pager for ASP.Net MVC, a PageBuilder, A CSS and a HtmlExtension for a pager. I made this a year ago...
Nothing new or fancy, but kind of useful in some contexts. Here is a PagedList class for making a List pageable. A builder for making the pager and an Extension to HTML to add it on the page. Maybe something similar will be added to MVC soon. So this is nothing new...
public interface IPagedList
{
int TotalRecords { get; }
int CurrentPage { get; }
int PageSize { get; }
int TotalPages { get; }
bool HasPreviousPage { get; }
bool HasNextPage { get; }
}
public class PagedList<T> : List<T>, IPagedList
{
private readonly int _currentPage;
private readonly int _pageSize = 10;
private readonly int _skip;
private readonly int _totalRecords;
private IEnumerable<T> _list;
public PagedList(IEnumerable<T> list, int currentPage, int pageSize)
{
_pageSize = pageSize;
_totalRecords = list.Count();
_skip = (currentPage - 1) * pageSize;
_currentPage = currentPage;
AddRange(GetPagedList(list));
}
public int TotalRecords
{
get { return _totalRecords; }
}
public int CurrentPage
{
get { return _currentPage; }
}
public int PageSize
{
get { return _pageSize; }
}
public int TotalPages
{
get
{
double tempTotalPage = (_totalRecords / (double)_pageSize);
return (int)Math.Ceiling(tempTotalPage);
}
}
public bool HasPreviousPage
{
get { return (_currentPage > 1); }
}
public bool HasNextPage
{
get { return (_currentPage < TotalPages); }
}
private List<T> GetPagedList(IEnumerable<T> list)
{
return list.Skip(_skip).Take(_pageSize).ToList();
}
}
And some simple class to generate a Pager:
public class DefaultPagingBuilder : IPagingBuilder
{
private const string LINK_FORMAT_CLASSNAME_URLPREFIX_PAGENUMBER_TEXT =
" <a class=\"{0}\" href=\"{1}/{2}\">{3}</a> ";
private const string NEXT_PAGING_CLASS = "nextPaging";
private const string NEXT_TEXT = ">";
private const string NUMBER_PAGING_CLASS = "numberPaging";
private const int PAGE_NUMBER_INTERVALL = 7;
private const string PREVIOUS_PAGING_CLASS = "previousPaging";
private const string PREVIOUS_TEXT = "<";
private const string SELECTED_NUMBER_PAGING_CLASS = "selectedNumberPaging";
public string BuildPager(IPagedList pagedList, string urlPrefix)
{
if (pagedList.TotalRecords == 0)
return string.Empty;
var pagingStringBuilder = new StringBuilder();
pagingStringBuilder.Append("<div id=\"pager\">");
BuildPreviousLink(pagedList, pagingStringBuilder, urlPrefix);
BuildPageNumbers(pagedList, pagingStringBuilder, urlPrefix);
BuildNextLink(pagedList, pagingStringBuilder, urlPrefix);
pagingStringBuilder.Append("</div>");
return pagingStringBuilder.ToString();
}
private static void BuildNextLink(IPagedList pagedList, StringBuilder pagingStringBuilder, string urlPrefix)
{
if (pagedList.HasNextPage)
pagingStringBuilder.Append(RenderPagingLink(NEXT_PAGING_CLASS, urlPrefix, pagedList.CurrentPage + 1,
NEXT_TEXT));
}
private static void BuildPreviousLink(IPagedList pagedList, StringBuilder pagingStringBuilder, string urlPrefix)
{
if (pagedList.HasPreviousPage)
pagingStringBuilder.Append(RenderPagingLink(PREVIOUS_PAGING_CLASS, urlPrefix, pagedList.CurrentPage - 1,
PREVIOUS_TEXT));
}
private static string RenderPagingLink(string styleClass, string urlPrefix, int pageNumber, string text)
{
return string.Format(LINK_FORMAT_CLASSNAME_URLPREFIX_PAGENUMBER_TEXT, styleClass, urlPrefix, pageNumber,
text);
}
private static void BuildPageNumbers(IPagedList pagedList, StringBuilder pagingStringBuilder, string urlPrefix)
{
int startPage = Math.Max(1, pagedList.CurrentPage - PAGE_NUMBER_INTERVALL);
int endPage = Math.Min(pagedList.TotalPages, pagedList.CurrentPage + PAGE_NUMBER_INTERVALL);
int pagesShown = endPage - startPage;
if (pagesShown < PAGE_NUMBER_INTERVALL*2)
{
int pagesMissing = PAGE_NUMBER_INTERVALL*2 - pagesShown;
if (startPage > 1)
startPage = Math.Max(1, startPage - pagesMissing);
else
endPage = Math.Min(pagedList.TotalPages, endPage + pagesMissing);
}
for (int i = startPage; i <= endPage; i++)
{
if (i >= 1 && i <= pagedList.TotalPages)
{
string numberPagingStyleClass = NUMBER_PAGING_CLASS;
if (i == pagedList.CurrentPage)
numberPagingStyleClass = SELECTED_NUMBER_PAGING_CLASS;
pagingStringBuilder.Append(RenderPagingLink(numberPagingStyleClass, urlPrefix, i, i.ToString()));
}
}
}
}
And a pager Extension to Html on ASP.Net MVC
public static class PagingListExtension
{
public static string Pager(this HtmlHelper helper, IPagedList pagedList, string urlPrefix)
{
var pageBuilkder = new DefaultPagingBuilder();
return pageBuilkder.BuildPager(pagedList, urlPrefix);
}
public static string LetterPager(this HtmlHelper helper,string currentSortLetter,string urlPrefix)
{
return GetLetterPager(currentSortLetter, urlPrefix);
}
private static string GetLetterPager(string currentSortLetter,string urlPrefix)
{
string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var pagerStringBuilder = new StringBuilder();
foreach (var letter in letters)
{
var isSelectedLetter = letter.ToString() == currentSortLetter;
if (isSelectedLetter)
pagerStringBuilder.Append("<b>");
pagerStringBuilder.Append(GetLetterTag(letter, urlPrefix));
if (isSelectedLetter)
pagerStringBuilder.Append("</b>");
}
return pagerStringBuilder.ToString();
}
private static string GetLetterTag(char letter,string urlPrefix)
{
return @"<a href=" + urlPrefix + "/" + letter + ">"+ letter +"</a> ";
}
public static string PagerStatus(this HtmlHelper helper, IPagedList pagedList)
{
var pagerStatusStringBuilder = new StringBuilder();
pagerStatusStringBuilder.Append("<div id=\"pagerStatus\">");
pagerStatusStringBuilder.Append("<div class=\"pagerStatusPage pagerStatusText\">");
pagerStatusStringBuilder.AppendFormat("Page:<span class=\"pagerNumber\">{0}</span>", pagedList.CurrentPage);
pagerStatusStringBuilder.Append("</div>");
pagerStatusStringBuilder.Append("<div class=\"pagerStatusTotalPages pagerStatusText\">");
pagerStatusStringBuilder.AppendFormat("av:<span class=\"pagerNumber\">{0}</span>", pagedList.TotalPages);
pagerStatusStringBuilder.Append("</div>");
pagerStatusStringBuilder.Append("<div class=\"pagerStatusTotalRecords pagerStatusText\">");
pagerStatusStringBuilder.AppendFormat("Total hits:<span class=\"pagerNumber\">{0}</span>",
pagedList.TotalRecords);
pagerStatusStringBuilder.Append("</div>");
pagerStatusStringBuilder.Append("</div>");
return pagerStatusStringBuilder.ToString();
}
public static PagedList<T> ToPagedList<T>(this IEnumerable<T> x, int pageNumber, int pageSize)
{
return new PagedList<T>(x, pageNumber, pageSize);
}
public static PagedList<T> ToPagedList<T>(this IEnumerable<T> x, int pageNumber)
{
return new PagedList<T>(x, pageNumber, 10);
}
}
And a pages.css file
#pager
{
}
.previousPaging
{
}
.numberPaging
{
}
.selectedNumberPaging
{
color: Red;
font-weight: bold;
text-decoration: none;
}
.nextPaging
{
}
.pagerStatus
{
}
.pagerStatusPage
{
}
.pagerStatusTotalPages
{
}
.pagerStatusTotalRecords
{
}
.pagerNumber
{
}
Eg:
<%= Html.PagerStatus(Model.Projects) %><br /><br />
<%= Html.Pager(Model.Projects, "/Project/ListAllProjects/"+ Model.SortOrder)%>
For a Pager based on chars like A B C D
<%= Html.LetterPager(Model.Projects .... ) %>
Model Eg of the model prop:
public PagedList<IProject> Projects { get; set; }
And to convert a IList to a PagedList
projectModel.Projects = projects.ToPagedList(pageNumber, 30);
this tells you that your List shall be a PagedList and what page you will start from and how many rerult each page... Default is 10.
Fork
PagedList class and paging code for ASP.Net MVC (Nothing new but kind of usefull.) - @johannormen Friday 23, 2010 12:05 AM
1 Feedback
You must log in before you can give any feedback
You must log in before you can post a comment


2.47k
0




Mark 'aspmvc' tag as 'like'
Mark 'aspmvc' tag as 'ignore'