English 中文(简体)
dotnetkicks.com如何实现他们的ASP.NET分页?
原标题:
  • 时间:2009-01-14 17:39:04
  •  标签:

我知道dotnetkicks.com系统是开源的,所以我可以查看代码,但我无法理解他们如何进行分页。很难解释,但如果您进入dotnetkicks.com,您可以在其首页上尝试分页。

我特别感兴趣的是他们是如何显示前几页,然后是“……”,然后又是最后几页。

它开始就像这样

上一页 1 2 3 4 5 6 ... 355 356 下一页 (Shàng yī yè 1 2 3 4 5 6 ... 355 356 xià yī yè)

然后,如果你点击第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; } }
}




相关问题
热门标签