代码之家  ›  专栏  ›  技术社区  ›  Dan

dotnetkicks.com是如何实现其ASP.NET分页的?

  •  0
  • Dan  · 技术社区  · 16 年前

    我知道 dotnetkicks.com 系统是开放源码的,所以我可以自己查看代码,但我无法理解它们是如何进行分页的。很难解释,但如果你去 多特尼克公司 你可以在他们的首页上玩寻呼。

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

    像这样开始

    前1 2 3 4 5 6…355下356

    如果你点击第10页,它会变成这个

    PREV 1 2…6 7 8 9 10 11 12 13 14…355下356

    这是迄今为止我最喜欢的寻呼系统,所以我想在我的网站上做同样的事情

    2 回复  |  直到 16 年前
        1
  •  1
  •   Adam Lassek    16 年前

    这个 Pagination control 如果您曾经编写过分页控件,那么在项目中是相当直接的。我想让你困惑的是 urlrewriting.net 对于/page/n url格式。

        2
  •  0
  •   Andrei Rînea    16 年前

    我写了这样一个控件,它需要一些代码…有很多决定要做。

    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; } }
    }
    
    推荐文章