【问题标题】:Generating a list of page numbers for a web page为网页生成页码列表
【发布时间】:2020-02-20 19:57:49
【问题描述】:

我正在尝试通过在每个页面顶部显示 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 页。

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

有什么想法吗?

谢谢!

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

【问题讨论】:

  • 也许这是一个愚蠢的评论。但是你为什么不只是像这样循环:@for (int i = 1; i
  • PagedList 在 IQueryable 上有一个扩展方法,因此当您处理大量数据时,您不需要全部加载。另外,如果你想自己处理分页,你可以创建一个StaticPagedList,并且仍然使用 PagedList 分页器。
  • @RonaDona 为您发布了用于 asp.net mvc 的可重用分页解决方案。
  • @cadrell 感谢您提供信息。刚刚检查过,你是对的。

标签: c# asp.net-mvc loops razor


【解决方案1】:

首先,我建议您先将“开始”和“结束”部分提取到局部变量中。这将使调试变得更加更容易。因此,您现有的代码将变为(暂时忽略 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++)

【讨论】:

  • @WaqasRaja:这篇文章的部分重点是解释诊断过程。 OP 的代码不包含Math.Floor,因此提取到局部变量的第一步也不应该。此外,您的替换没有给出相同的结果。例如,如果 page 为 10,则 (Math.Ceiling(page / 10 -1) * 10) + 1 返回 1,而 (Math.Floor(page / 10) * 10) + 1 返回 11。
【解决方案2】:

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

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);

【讨论】:

  • 注意:这会生成11个项目(奇数),所以当前页面会在中间
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-01-13
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多