生成分页链接

时间:2010-05-27 18:39:41

标签: c# asp.net

我正在尝试实现一个分页系统,该系统显示附近的页码以及每个极端的页面。例如,如果用户位于第20页的40页,则应显示以下链接:1,2 ... 18,19,[20],21,22 ... 39,40。解决方案类似于这里描述的那个:

http://90poe.com/alex-lee-on-bell-curve-pagination

我已经看到在PHP中执行此操作的代码,但在ASP.net中没有(理想情况下我正在寻找C#代码)。如果有人之前做过这样的事情,那么查看你的代码会非常有帮助。

2 个答案:

答案 0 :(得分:3)

生成分页链接所需的代码在很大程度上取决于您使用的基于ASP.NET的技术。使用ASP.NET MVC时需要不同的代码,Web窗体的代码不同,RepeaterGrid等控件的代码也不同。

无论如何,您需要生成要显示的页码。以下代码显示了如何使用LINQ和C#3.0执行此操作。我们首先生成所有范围(开始,在当前页面周围,结束),然后删除无效页面(例如max + 1)并确保每个页面只返回一次:<​​/ p>

// Generate all three ranges
var pages = new[] { 1, 2 }.Concat(
            Enumerable.Range(current-2, 5)).Concat(
            new[] { max-1, max });

// Filter invalid pages and make sure we return each page only once
pages.Where(n => n >= 1 && n <= max).Distinct();

你可以用很多if来写这个,但是可能很难让所有的情况都正确,所以这可能是更优雅的方法。但是,将其与特定技术绑定可能是另一个问题的主题。

答案 1 :(得分:1)

我是Tomas的第二个解决方案。

如果您不能使用LINQ,以下是以下所有内容:

    private List<int> PaginationPageNumbers(int CurrentPage, int TotalPages)
    {
        int i;
        List<int> lst = new List<int>();

        if (TotalPages > 0) lst.Add(1);

        if (TotalPages > 1) lst.Add(2);

        i = CurrentPage - 2;
        if (i > 2) lst.Add(i);

        i = CurrentPage - 1;
        if (i > 2) lst.Add(i);

        if (CurrentPage > 2) lst.Add(CurrentPage);

        i = CurrentPage + 1;
        if ((i > 2) && (i <= TotalPages)) lst.Add(i);

        i = CurrentPage + 2;
        if (i <= TotalPages) lst.Add(i);

        i = TotalPages - 1;
        if (i > (CurrentPage + 2)) lst.Add(i);

        if (TotalPages > (CurrentPage + 2)) lst.Add(TotalPages);

        return lst;
    }