Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using System.Web.Mvc.Html;
- namespace MuranoTestAssignment.Common
- {
- public class PagingDisplayInfo
- {
- public List<int> pages { get; private set; }
- public int current { get; private set; }
- public bool hasPrev { get; private set; }
- public bool hasNext { get; private set; }
- private int NormalizePageNumber(int pageNumber, int pageCount)
- {
- if (pageNumber < 1)
- {
- pageNumber = 1;
- }
- if (pageCount > 0 && pageNumber > pageCount)
- {
- pageNumber = pageCount;
- }
- return pageNumber;
- }
- private List<int> GetPagesInRange(int lowerBound, int upperBound, int pageCount)
- {
- lowerBound = NormalizePageNumber(lowerBound, pageCount);
- upperBound = NormalizePageNumber(upperBound, pageCount);
- List<int> pages = new List<int>();
- for (int pageNumber = lowerBound; pageNumber <= upperBound; pageNumber++)
- {
- pages.Add(pageNumber);
- }
- return pages;
- }
- /// <summary>
- /// Возвращвет массив с номерами страниц.
- /// </summary>
- /// <param name="pageRange">Количество ссылок на стринице</param>
- /// <param name="pageNumber">Номер страницы</param>
- /// <param name="pageCount">Общее количество страниц</param>
- /// <returns>Список номеров страниц для отображения.</returns>
- private List<int> GetPages(int pageRange, int pageNumber, int pageCount)
- {
- // берем приблизительно по половине страниц в обе стороны
- int delta = (int)Math.Ceiling((double)pageRange / 2);
- // Если pageNumber - delta > pageCount - pageRange.
- // Т.е. если мы пытаемся взять больше страниц чем есть.
- int lowerBound = pageCount - pageRange + 1;
- int upperBound = pageCount;
- // Ели страниц хватает.
- if (pageNumber - delta <= pageCount - pageRange)
- {
- if (pageNumber - delta < 0)
- {
- delta = pageNumber;
- }
- int offset = pageNumber - delta;
- lowerBound = offset + 1;
- upperBound = offset + pageRange;
- }
- return GetPagesInRange(lowerBound, upperBound, pageCount);
- }
- /// <summary>
- /// Конструктор создает так называемы Sliding Paging.
- /// </summary>
- /// <param name="totalCount">Общее количество элементов для отображения.</param>
- /// <param name="pageRange">Количестово ссылок на странице.</param>
- /// <param name="itemsCount">Количество элментов на странице.</param>
- /// <param name="pageNumber">Номер текущей страницы.</param>
- public PagingDisplayInfo(int totalCount, int pageRange,
- int itemsCount, int pageNumber)
- {
- // сколько всего страниц
- int pageCount = (int)Math.Ceiling((double)totalCount / itemsCount);
- // выводим по LINKS_ON_PAGE страниц
- this.current = NormalizePageNumber(pageNumber, pageCount);
- this.hasPrev = current - 1 > 0;
- this.hasNext = current + 1 <= pageCount;
- this.pages = GetPages(pageRange, this.current, pageCount);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment