I will be back!

一种ASP网页分页的方法

作者:愤怒的小马 来源:www.bellman7.cn 发表于:2009-02-27

为了给留言板分页,研究了下分页方法,这是我的最终效果:效果预览下载页面

首先说明一下,下面只讨论具体的分页方法,至于数据库的连接及Recordset对象的属性和方法,这里有很好的阐述:asp分页显示技术

按照我的习惯,要解决问题,先列出问题的已知条件:

  1. 总页数;
  2. 当前页码;
  3. 当前页之前要显示的页数;
  4. 当前页之后要显示的页数;
  5. 要链接的页面地址;

再列出想要的结果,网页分页一般有以下一些项目要求显示:

  1. 首页、尾页的链接;
  2. 上一页、下一页的链接;
  3. 当前页码;
  4. 当前页之前的部分页面链接;
  5. 当前页之后的部分页面链接;
  6. 全部页面链接中省略的部分表示;

如果分成两种情况来考虑,这个问题就简单了

  1. 首页、尾页、前后省略部分加上当前页码共5项,当总页数不大于(5+当前页之前要显示的页数+当前页之后要显示的页数)时直接把所有页面链接显示出来;
  2. 当总页数超出上述页数时,所有项目都有显示,情况就比较简单了;

下面列出了我的代码并配以注释,希望能说清楚。

<%
'常量定义
Const PAGE_PREV_D = -4'无效的上一页
Const PAGE_NEXT_D = -3'无效的下一页
Const PAGE_PREV = -2'上一页
Const PAGE_NEXT = -1'上一页
Const PAGE_NONE = 0'省略项

'显示单个页面链接的方法,用这个Sub统一管理,便于更改样式。
'nPageNo 要显示的页面
'nCurrent 当前页码
'szPage 页面链接前缀,一般为:some.asp?page=

sub showALink(nPageNo, nCurrent, szPage)
    if nPageNo = nCurrent then
        Response.Write("<span class=""current"">" & nPageNo & "</span>")
    elseif nPageNo > 0 then
        Response.Write("<a href=""" & szPage & nPageNo & """>" & nPageNo & "</a>")
    elseif nPageNo = PAGE_PREV then
        Response.Write("<a href=""" & szPage & nCurrent-1 & """><</a>")
    elseif nPageNo = PAGE_PREV_D then
        Response.Write("<span class=""disabled""><</span>")
    elseif nPageNo = PAGE_NEXT then
        Response.Write("<a href=""" & szPage & nCurrent+1 & """>></a>")
    elseif nPageNo = PAGE_NEXT_D then
        Response.Write("<span class=""disabled"">></span>")
    elseif nPageNo = PAGE_NONE then
        Response.Write(" ... ")
    end if
end sub

'显示所有页面链接。
'nCurrent 当前页码
'nPageCount 总页数
'nLeft 当前页之前要显示的页数
'nRight 当前页后要显示的页数
'szPage 页面链接前缀,一般为:some.asp?page=

sub showLinks(nCurrent, nPageCount, nLeft, nRight, szPage)
    Dim nStart
    Dim nEnd
    Dim i

    '上一页
    if nCurrent > 1 then
        showALink PAGE_PREV, nCurrent, szPage
    else
        showALink PAGE_PREV_D, nCurrent, szPage
    end if

    if nPageCount <= nLeft + nRight + 5 then
        '总页数不大于全部可能项目数,简单列出所有链接
        for i = 1 to nPageCount
            showALink i, nCurrent, szPage
        next
    else
        '首页
        showALink 1, nCurrent, szPage

        '前面省略部分,如果只有一页省略则显示为链接
        if nStart = 3 then
            showALink 2, nCurrent, szPage
        else
            showALink PAGE_NONE, nCurrent, szPage
        end if

        '计算当前页码及其前后的链接范围
        nStart = nCurrent - nLeft
        if nStart < 3 then
            '首对齐
            nStart = 3
            nEnd = nStart + nLeft + nRight
        else
            nEnd = nCurrent + nRight
            if nEnd > nPageCount - 2 then
                '尾对齐
                nEnd = nPageCount - 2
                nStart = nEnd - nLeft - nRight
            end if
        end if

        '显示当前页码及其前后的链接
        for i = nStart to nEnd
            showALink i, nCurrent, szPage
        next

        '后面省略部分,如果只有一页省略则显示为链接
        if i + 1 = nPageCount then
            showALink i, nCurrent, szPage
        else
            showALink PAGE_NONE, nCurrent, szPage
        end if

        '尾页
        showALink nPageCount, nCurrent, szPage
    end if

    '下一页
    if nCurrent < nPageCount then
        showALink PAGE_NEXT, nCurrent, szPage
    else
        showALink PAGE_NEXT_D, nCurrent, szPage
    end if
end sub

'典型的调用方法
showLinks nPage, nPageCount, 4, 4, "index.asp?&page="

%>
关闭