2013-06-04 2 views
3

Я пытаюсь добавить пейджинг на сайт, показывая 10 номеров в верхней части каждой страницы. Я написал этот код для создания 10 номеров, соответствующих каждой страницеСоздание списка номеров страниц для веб-страницы

@for (int i = (Math.Ceiling(page/10 - 1) * 10) + 1; i <= Math.Ceiling(page/10 - 1) * 10 + 10 ; i++) 
    { 
     @Html.ActionLink(i.ToString(), "ShowItems", page = i.ToString() }) 
     @Html.Raw(","); 
    } 

Это работает отлично, за исключением конца. Например, если у меня есть 12 страниц, пейджинговая покажет

1 2 3 4 5 6 7 8 9 10 

Для всех страниц между 1-10 и затем покажет

11 12 13 14 15 16 17 18 19 20 

Для страниц 11 и 12.

Мне нужно измените мой цикл на то, что останавливает счетчик на последней странице.

Любые идеи?

Спасибо!

P.S Я не хочу использовать PagedList, поскольку я имею дело с огромными данными и не могу загрузить его на одном.

+1

может быть, это глупый комментарий. Но почему вы не просто зацикливаетесь так: @for (int i = 1; i <= page; i ++) { @ Html.ActionLink (i.ToString(), "ShowItems", page = i.ToString ()}) @ Html.Raw (","); } –

+1

PagedList имеет метод расширения на IQueryable, поэтому, когда вы имеете дело с большим количеством данных, вам не нужно загружать все это. Кроме того, если вы хотите обрабатывать пейджинг самостоятельно, вы можете создать «StaticPagedList» и использовать пейджер PagedList. – cadrell0

+0

@RonaDona отправила вам многоразовое пейджинговое решение для asp.net mvc. – qwr

ответ

7

Во-первых, я бы посоветовал сначала вывести части «старт» и «конец» в локальные переменные. Это сделает намного легче отлаживать. Таким образом, ваш существующий код стал бы (без учета синтаксиса Razor в настоящее время):

int startPage = (Math.Ceiling(page/10 - 1) * 10) + 1; 
int endPage = Math.Ceiling(page/10 - 1) * 10 + 10; 
for (int i = startPage; i <= endPage; i++) 

я затем извлечь использовать тот факт, что вы уже сделали большую часть работы для вычисления endPage вычислить startPage:

int startPage = (Math.Ceiling(page/10 - 1) * 10) + 1; 
int endPage = startPage + 9; 
for (int i = startPage; i <= endPage; i++) 

Теперь нужно просто ограничить его количества страниц:

int startPage = (Math.Ceiling(page/10 - 1) * 10) + 1; 
int endPage = Math.Min(startPage + 9, totalPages); 
for (int i = startPage; i <= endPage; i++) 
+0

Ты блестящий. Благодаря! – RonaDona

-1

Вы можете просто использовать mod (%), чтобы найти остаток и как те, что указаны на последних страницах.

как в

12% 10 = 2. Таким образом, последняя секция будет иметь 2 страницы.

0

Я реализовал способ сделать это некоторое время назад

private IEnumerable<int> GetPaginationInfo(int total, int itemsPerPage, int currentPage, int rangeBeforeAndAfter = 2) 
{ 
    int minPage = 0; 
    int maxPage = ((int)Math.Ceiling((double)(((double)total)/((double)itemsPerPage)))) - 1; 
    int beginPage = currentPage - rangeBeforeAndAfter; 
    int endPage = currentPage + rangeBeforeAndAfter; 
    if (beginPage < minPage) 
    { 
     endPage += -beginPage; 
     beginPage = minPage; 
    } 
    if (endPage > maxPage) 
    { 
     beginPage -= endPage - maxPage; 
     if (beginPage < minPage) 
     { 
      beginPage = minPage; 
     } 
     endPage = maxPage; 
    } 
    return Enumerable.Range(beginPage + 1, (endPage + 1) - beginPage); 
} 

Вызов

GetPaginationInfo(100, 10, 0, 5); 
+0

Примечание: это генерирует 11 элементов (нечетное число), поэтому текущая страница будет включена в центре – BrunoLM

Смежные вопросы