#c# #razor #blazor #asp.net-blazor
#c# #для-петли #блейзор
Вопрос:
Используя Blazor, я создаю функцию разбиения на страницы для своего проекта. Основная концепция заключается в том, чтобы просто использовать linq .Skip() и .Take(), я буду брать только элементы списка для страницы, на которую был сделан щелчок, из списка.
Код, который создает кнопки разбиения на страницы: (Например: 1,2,3)
lt;ul class="pagination float-center"gt; @for (int i = 0; i lt; Math.Ceiling((decimal)articleService.ReturnAll().Count() / numPerPage); i ) { lt;li class="page-item"gt;lt;a class="page-link" onclick="@(() =gt; ReturnPage(i))"gt;@ilt;/agt;lt;/ligt; } lt;/ulgt;
Я не возражаю против использования индексации 0 здесь для разбиения на страницы.
Этот приведенный выше код создает кнопки, которые при нажатии (скажем, страница 1, которая является 2-й страницей) передают индекс цикла for, который я позже умножу на количество на страницу, чтобы получить количество элементов в списке, которые нужно пропустить.
Например, при нажатии на страницу 1 мне нужно будет пропустить 2 элемента в списке, а затем перейти к следующим 2. (Предполагая, что мне нужно 2 элемента в качестве суммы на страницу)
Затем моя функция ReturnPage пропустит текущую страницу (что нажато) — 1, затем умножит на 2 (или количество на страницу), чтобы найти общую сумму, которую нужно пропустить. Если пользователь нажимает 0 (первая страница), то мне нужно .Пропустить(0) и просто .Возьмите(количество на страницу).
void ReturnPage(int i) { articles = articleService.ReturnAll() .OrderByDescending(x =gt; x.LastUpdated) .Skip((i == 0) ? 0 : (i - 1) == 0 ? numPerPage : (i - 1) * numPerPage) .Take(numPerPage) .ToList(); }
Помещая это в контекст, если у меня есть список (статей) с общим количеством элементов 3. Это вернет мне кнопки разбиения на страницы 0,1. На странице 0 будут показаны 2 элемента, а на странице 1-1 элемент.
Если я нажму кнопку разбиения на страницы 1, я должен передать 1 (i) методу ReturnPage, и это вычислит количество пропущенных элементов 2. Это означает, что на этой странице будут пропущены первые 2 пункта в списке, затем перейдите к следующим 2. (в данном случае только 1 пункт)
Если я нажму кнопку «Вернуться к разбиению на страницы» 0, я должен передать значение i 0, ничего не пропуская, и просто взять первые 2 элемента.
Однако я вообще не вижу, чтобы правильное значение (i) передавалось в функцию ReturnPage.
При выполнении того же примера, который я описал выше, цикл for возвращает правильное количество кнопок:
Но при отладке у меня есть значение 2 (каждый раз?). Что отбрасывает все это .Функция пропуска ().
Моя интерпретация такова, что, полностью игнорируя материал linq, что-то в цикле for неправильно. Это условие кажется мне правильным. Если у меня есть количество 3 и 2 на страницу, что равно 1,5, что будет означать 2 страницы. Таким образом, мои значения i должны быть 0 и 1, но почему-то их 2?
Должно быть, я упускаю здесь что-то фундаментальное, какие-нибудь идеи?
Комментарии:
1. Похоже, ваш код должен делать то, что вы описываете. Вы можете опубликовать полную копию?
Ответ №1:
Ваш цикл for должен содержать локальную переменную, подобную этой:
@for (int i = 0; i lt; Math.Ceiling((decimal)articleService.ReturnAll().Count() / numPerPage); i ) { var localVariable = i; lt;li class="page-item"gt;lt;a class="page-link" onclick="@(() =gt; ReturnPage(localVariable ))"gt;@ilt;/agt;lt;/ligt; }
Это стандартное поведение C#, в котором лямбда-выражение @(() =gt; ReturnPage(LocalVariable )) имеет доступ к переменной, а не к значению переменной. Вы должны определить переменную, локальную для цикла for, иначе ваше лямбда-выражение всегда будет вызывать ReturnPage(i), а i равно математике.Потолок((десятичная)статья).ReturnAll().Count() в конце цикла.
Комментарии:
1. Это сделало свое дело!! Большое вам спасибо! Правильно ли говорить, что, используя только я, он действует почти как ссылочный тип, не будучи ссылочным типом? Т. Е. то, что я передаю на ReturnPage, на самом деле является ссылкой на ячейку памяти i, которая не меняется, но значение продолжает меняться на каждой итерации.
2. Да, значение переменной i вычисляется при вызове выражения lambada, а не при его назначении. Поэтому, если вы вызовете его после выполнения всех итераций цикла, значение переменной i будет таким, каким было конечное значение переменной.