Признанный и принятый алгоритм или утилита для пейджинговой навигации? - PullRequest
1 голос
/ 01 марта 2012

Уже существует признанная реализация .NET для рендеринга навигации по страницам с пропусками?Например:

1) 12 страниц, размер подмножества 6, текущая страница 9 выдаст: 1 ... 9 10 11 12 (точки ведут на страницу 4)

2) 5страниц, размер подмножества 3, текущая страница 3 выдаст: ... 3 ... (точки ведут к 1-2 и 4-5)

3) 14 страниц, размер подмножества 8, текущая страница 6 будетпроизвести: 1 ... 5 6 8 9 ... 14 (точки ведут к 3 и 11)

Результатом должен быть массив или список, который будет использоваться при рендеринге.Ссылки, приведенные ниже, не дают приемлемой реализации / модульного тестирования:

Алгоритм интеллектуальной пагинации

Алгоритм / псевдокод для создания пейджинговых ссылок?

Создание первого, последнего, следующего 10, здесь не имеет значения предыдущий 10.

Делать это самому - все равно что заново изобретать велосипед.

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Не получил ответа и должен был написать свой.Может быть, это кому-нибудь пригодится ...

Отрицательные значения говорят о том, что необходимо использовать "...", а абсолютное значение дает номер страницы, к которому ведет "...".Массив результатов должен использоваться для отображения страниц навигации.

/// <summary>
        /// Creates the template to be used for rendering the page navigation with skips.
        /// </summary>
        /// <param name="a_pagesNum"></param> Total pages number
        /// <param name="a_pageSetSize"></param> The size of the page set to render
        /// <param name="a_curPageNum"></param> The current page number (not index)
        /// <returns></returns>
public static int[] DoPageDist(int a_pagesNum, int a_pageSetSize, int a_curPageNum)
        {
            // Validate 
            if (a_pagesNum < 1 || a_pageSetSize < 1 || a_curPageNum < 1 | a_curPageNum > a_pagesNum)
            {
                return null;
            }

            if (a_pageSetSize > a_pagesNum)
            {
                a_pageSetSize = a_pagesNum;
            }

            // What are the conditions around the current index?
            int leftNums = a_curPageNum;
            int rightNums = a_pagesNum - a_curPageNum;
            int rightSlots = a_pageSetSize / 2;
            int leftSlots = rightSlots + a_pageSetSize % 2;

            int tail = rightNums - rightSlots;
            if (tail < 0)
            {
                leftSlots -= tail;
            }
            else
            {
                tail = leftNums - leftSlots;
                if (tail < 0)
                {
                    rightSlots -= tail;
                }
            }

            int[] result = new int[a_pageSetSize];

            int slotNum = 0;
            for (int idx = (a_pageSetSize > 2) ? 1 : a_curPageNum - leftSlots + 1; idx <= a_pagesNum && slotNum < a_pageSetSize; idx++)
            {
                if (idx <= a_curPageNum)
                {
                    if ((1 == idx && a_pageSetSize > 4) ||
                        (idx >= a_curPageNum - (leftSlots - 1)))
                    {
                        result[slotNum] = idx;
                    }
                    else
                    {
                        result[slotNum] = (slotNum > 0) ? -((a_curPageNum - (leftSlots - 2)) / 2) : -1;
                        idx = a_curPageNum - (leftSlots - 2) - 1;
                    }
                    leftSlots--;
                }
                else
                {
                    if ((rightNums - rightSlots <= 0) ||
                        (idx <= a_curPageNum + (rightSlots - 2)) ||
                        (idx == a_pagesNum))
                    {
                        result[slotNum] = idx;
                    }
                    else if (idx < a_pagesNum)
                    {
                        result[slotNum] = (slotNum < a_pageSetSize - 1) ? -(idx + (a_pagesNum - idx) / 2) : -a_pagesNum;
                        idx = a_pagesNum - (a_pageSetSize - slotNum - 1);
                    }
                }
                slotNum++;
            }

            return result;
        }
0 голосов
/ 26 июня 2013

Это может быть излишним для небольшого количества страниц, но для разбивки на страницы действительно больших наборов данных, рассмотрите логарифмический метод, описанный здесь .Я разместил алгоритмы для этого как в PHP, так и (в классическом) ASP, но конвертировать в ASP.NET было бы довольно просто.

...