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; } }
}
不隶属于 StackOverflow