Как dotnetkicks.com реализовал свою страничку ASP.NET?
-
22-07-2019 - |
Вопрос
Я знаю, что dotnetkicks.com система с открытым исходным кодом, поэтому я могу просматривать код самостоятельно, но могу не имеет смысла, как они сделали их пейджинг. Это сложно объяснить, но если вы перейдете на dotnetkicks.com , вы можете поиграть с подкачкой на их главной странице. р>
Что меня особенно интересует, так это то, как они показывают первые несколько страниц, а затем " ... " а затем последние несколько страниц.
Все начинается так
Предыдущая 1 2 3 4 5 6 ... 355 356 Следующая
Тогда, если вы нажмете на страницу 10, она изменится на эту
Предыдущая 1 2 ... 6 7 8 9 10 11 12 13 14 ... 355 356 Следующая
Это, безусловно, моя любимая система подкачки страниц, поэтому я бы хотел сделать то же самое на своих сайтах
Решение
Элемент управления разбиением на страницы в проекте довольно прост, если вы когда-либо писали элемент управления разбиением на страницы. Я думаю, что вас может смущать использование urlrewriting.net для формата / page / n url. р>
Другие советы
Я написал такой элемент управления, и он занял некоторый код ... есть много решений, которые нужно принять.
public class SimplePagerLinkGenerator : IPagerLinkGenerator
{
private PagingDisplaySettings _displaySettings;
public SimplePagerLinkGenerator(PagingDisplaySettings displaySettings)
{
this._displaySettings = displaySettings;
}
public PageLinkData[] GetPagesLinkData(uint crtPageIndex, uint pageCount, ushort pageSize,
string urlLinkTemplate)
{
int i, crtPage = (int)crtPageIndex, pageCnt = (int)pageCount,
pgInnerCnt = (int)this._displaySettings.PagesBeforeOrAfterCurrent,
pgEndCnt = (int)this._displaySettings.PagesShownAtEndingsCount;
int innerBlockStart = crtPage - pgInnerCnt;
int innerBlockEnd = crtPage + pgInnerCnt;
int innerBlockStartNormalized = innerBlockStart < 1 ? 1 : innerBlockStart;
int innerBlockEndNormalized = innerBlockEnd > pageCount ? pageCnt : innerBlockEnd;
List<PageLinkData> result = new List<PageLinkData>(2 * pgEndCnt + 3 + 2 * pgInnerCnt);
for (i = 1; i <= pgEndCnt && i <= pageCount; i++)
result.Add(new PageLinkData(i, i == crtPage, urlLinkTemplate, pageSize));
if (i > pageCount)
return result.ToArray();
if (innerBlockStart > pgEndCnt + 1)
{
result.Add(PageLinkData.Ellipsis);
for (i = innerBlockStart; i <= innerBlockEndNormalized; i++)
result.Add(new PageLinkData(i, i == crtPage, urlLinkTemplate, pageSize));
}
else
for (i = pgEndCnt + 1; i <= innerBlockEndNormalized; i++)
result.Add(new PageLinkData(i, i == crtPage, urlLinkTemplate, pageSize));
if (innerBlockEnd < pageCount - pgInnerCnt)
{
result.Add(PageLinkData.Ellipsis);
for (i = pageCnt - pgInnerCnt + 1; i <= pageCount; i++)
result.Add(new PageLinkData(i, i == crtPage, urlLinkTemplate, pageSize));
}
else
for (; i <= pageCount; i++)
result.Add(new PageLinkData(i, i == crtPage, urlLinkTemplate, pageSize));
return result.ToArray();
}
public PagingDisplaySettings DisplaySettings { get { return this._displaySettings; } }
}