Ejemplo n.º 1
0
        public static MvcHtmlString Pager(this HtmlHelper htmlHelper, IPagedEnumerable list, int maximumNumericLinks, string pagerPreviousClass, string pagerNextClass, string pagerDisabledClass, string pagingNumberClass, string pagingNumberCurrentClass)
        {
            if (maximumNumericLinks % 2 != 1)
                throw new ArgumentException("Value must be an odd number.", "maximumNumericLinks");

            var url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

            #region Previous Link

            var prev = new TagBuilder("div");
            prev.AddCssClass("pagerPreviousHolder");

            var prevLink = new TagBuilder("a");
            prevLink.SetInnerText("<< Prev");
            if (list.Page > 1)
                prevLink.MergeAttribute("href", url.StateUrl(new { page = list.Page - 1 }));
            else
                prevLink.AddCssClass(pagerDisabledClass);
            prevLink.AddCssClass(pagerPreviousClass);

            prev.InnerHtml = prevLink.ToString(TagRenderMode.Normal);

            #endregion
            #region Numeric Links

            var numerics = new TagBuilder("div");
            numerics.AddCssClass("pagerNumberHolder");

            if (list.TotalPages > 0)
            {

                int pagingStartNumber = -1;
                int pagingEndNumber = -1;

                if ((list.TotalPages >= maximumNumericLinks) && (list.Page > (int)Math.Ceiling((double)maximumNumericLinks / 2D)))
                    pagingStartNumber = list.Page - (int)Math.Floor((double)maximumNumericLinks / 2D);
                else
                    pagingStartNumber = 1;

                if (list.TotalPages >= (pagingStartNumber + maximumNumericLinks))
                    pagingEndNumber = pagingStartNumber + (maximumNumericLinks - 1);
                else
                {
                    if (list.TotalPages >= maximumNumericLinks)
                        pagingStartNumber = list.TotalPages - (maximumNumericLinks - 1);

                    pagingEndNumber = list.TotalPages;
                }

                //for (int i = pagingStartNumber; i <= pagingEndNumber; i++)
                for (int i = pagingEndNumber; i >= pagingStartNumber; i--)
                {
                    var numberTag = new TagBuilder("a");
                    numberTag.SetInnerText(i.ToString());
                    if (i == list.Page) 
                        numberTag.AddCssClass(pagingNumberCurrentClass);
                    else
                        numberTag.MergeAttribute("href", url.StateUrl(new { page = i }));
                    numberTag.AddCssClass(pagingNumberClass);                    
                    numerics.InnerHtml = numerics.InnerHtml + numberTag.ToString();
                }

            }
            else
            {
                //numerics.InnerHtml = "&nbsp;"; // Stops div colapsing
            }

            #endregion
            #region Next Link

            var next = new TagBuilder("div");
            next.AddCssClass("pagerNextHolder");

            var nextLink = new TagBuilder("a");
            nextLink.SetInnerText("Next >>");
            if (list.Page < list.TotalPages)
                nextLink.MergeAttribute("href", url.StateUrl(new { page = list.Page + 1 }));
            else
                nextLink.AddCssClass(pagerDisabledClass);
            nextLink.AddCssClass(pagerNextClass);

            next.InnerHtml = nextLink.ToString();

            #endregion
            
            return MvcHtmlString.Create(string.Format("<div class=\"pagerHolder\">{0}{3}{0}{2}{0}{1}</div>", Environment.NewLine, prev, numerics, next));
        }