3

我正在尝试通过在每个页面的顶部显示 10 个数字来向网站添加分页。我编写了这段代码来生成对应于每一页的 10 个数字

@for (int i = (Math.Ceiling( page / 10 - 1) * 10 ) + 1; i <= Math.Ceiling( page / 10 - 1) * 10 + 10 ; i++)
    {
        @Html.ActionLink(i.ToString(), "ShowItems", page = i.ToString() })
        @Html.Raw(",");
    }

这工作正常,除了结束。例如,如果我有 12 页,分页将显示

 1  2  3  4  5  6  7  8  9  10

对于 1-10 之间的所有页面,然后将显示

 11 12 13 14 15 16 17 18 19 20

对于第 11 页和第 12 页。

我需要将我的循环更改为在最后一页停止计数器的东西。

有任何想法吗?

谢谢!

PS我不想使用PagedList,因为我正在处理大量数据并且无法一次加载它。

4

3 回答 3

8

首先,我建议您先将“开始”和“结束”部分提取到局部变量中。这将使调试变得更加容易。因此,您现有的代码将变为(暂时忽略 Razor 语法):

int startPage = (Math.Ceiling(page / 10 - 1) * 10) + 1;
int endPage = Math.Ceiling(page / 10 - 1) * 10 + 10;
for (int i = startPage; i <= endPage; i++)

然后,我将提取使用您已经完成大部分计算工作的endPage事实startPage

int startPage = (Math.Ceiling(page / 10 - 1) * 10) + 1;
int endPage = startPage + 9;
for (int i = startPage; i <= endPage; i++)

现在您只需要将其限制为页数:

int startPage = (Math.Ceiling(page / 10 - 1) * 10) + 1;
int endPage = Math.Min(startPage + 9, totalPages);
for (int i = startPage; i <= endPage; i++)
于 2013-06-04T18:15:39.557 回答
0

不久前我已经实现了一种方法来做到这一点

private IEnumerable<int> GetPaginationInfo(int total, int itemsPerPage, int currentPage, int rangeBeforeAndAfter = 2)
{
    int minPage = 0;
    int maxPage = ((int)Math.Ceiling((double)(((double)total) / ((double)itemsPerPage)))) - 1;
    int beginPage = currentPage - rangeBeforeAndAfter;
    int endPage = currentPage + rangeBeforeAndAfter;
    if (beginPage < minPage)
    {
        endPage += -beginPage;
        beginPage = minPage;
    }
    if (endPage > maxPage)
    {
        beginPage -= endPage - maxPage;
        if (beginPage < minPage)
        {
            beginPage = minPage;
        }
        endPage = maxPage;
    }
    return Enumerable.Range(beginPage + 1, (endPage + 1) - beginPage);
}

称呼

GetPaginationInfo(100, 10, 0, 5);
于 2013-06-04T18:17:57.040 回答
-1

您可以只使用 mod (%) 来查找剩余部分,并将其作为最后一页。

如在

12 % 10 = 2。所以最后一节将有 2 页。

于 2013-06-04T18:15:19.743 回答