/// Copyright 2010 Sedo Technologies, LLC (http://sedotech.com/) /// @author Sayed Ibrahim Hashimi namespace InlineTasks.Common.ViewHelpers.HtmlView { using System; using System.Web; using System.Web.Mvc; // This uses the files from http://mvcviewhelpers.codeplex.com/ // based on http://weblogs.asp.net/gunnarpeipman/archive/2010/02/21/simple-pager-for-asp-net-mvc.aspx public class Pager : AbstractHtmlViewObject { public Pager(IViewRequestContext requestContext, string name, int currentPage, int currentPageSize, long totalRecords, string urlPrefix) : base(requestContext, name) { if (urlPrefix == null) { throw new ArgumentNullException("urlPrefix"); } if (currentPage <= 0) { currentPage = 1; } if (currentPageSize <= 0) { throw new ArgumentException("Must be greater than zero", "currentPageSize"); } this.CurrentPage = currentPage; this.CurrentPageSize = currentPageSize; this.TotalRecords = totalRecords; this.UrlPrefix = urlPrefix; } protected virtual int CurrentPage { get; set; } protected virtual int CurrentPageSize { get; set; } protected virtual long TotalRecords { get; set; } protected virtual string UrlPrefix { get; set; } public override void StartView() { HttpResponseBase httpResponse = this.RequestContext.HttpResponse; FluentTagBuilder container = new FluentTagBuilder("span") .AddCssClass("pager"); httpResponse.Write(container.ToString(TagRenderMode.StartTag)); int pageCount = (int)Math.Ceiling((double)this.TotalRecords / (double)CurrentPageSize); if (CurrentPage > 1) { FluentTagBuilder startTag = new FluentTagBuilder("a") .AddAttribute("href", string.Format("{0}/{1}", this.UrlPrefix, 1)) .SetInnerText("<<") .AddAttribute("title", "first page"); httpResponse.Write(startTag.ToString(TagRenderMode.Normal)); FluentTagBuilder previous = new FluentTagBuilder("a") .AddAttribute("href", string.Format("{0}/{1}", this.UrlPrefix, this.CurrentPage - 1)) .SetInnerText("<") .AddAttribute("title", "previous page"); httpResponse.Write(previous.ToString(TagRenderMode.Normal)); } int startPage = Math.Max(CurrentPage - 2, 1); int endPage = Math.Min(pageCount, CurrentPage + 2); for (int i = startPage; i < endPage; i++) { FluentTagBuilder link = new FluentTagBuilder("a") .AddAttribute("href", string.Format("{0}/{1}", this.UrlPrefix, i + 1)) .SetInnerText((i + 1).ToString()); if (i == CurrentPage) { link.AddCssClass("pagerCurrent"); } httpResponse.Write(link.ToString(TagRenderMode.Normal)); } if (CurrentPage < pageCount) { FluentTagBuilder nextTag = new FluentTagBuilder("a") .AddAttribute("href", string.Format("{0}/{1}", this.UrlPrefix, this.CurrentPage + 1)) .SetInnerText(">") .AddAttribute("title", "next page"); httpResponse.Write(nextTag.ToString(TagRenderMode.Normal)); FluentTagBuilder lastTag = new FluentTagBuilder("a") .AddAttribute("href", string.Format("{0}/{1}", this.UrlPrefix, pageCount)) .AddAttribute("title", "last page") .SetInnerText(">>"); httpResponse.Write(lastTag.ToString(TagRenderMode.Normal)); } httpResponse.Write(container.ToString(TagRenderMode.EndTag)); } public override void EndView() { // nothing to do here } } }