我正在尝试实现一个分页系统,该系统显示附近的页码以及每个极端的页面。例如,如果用户位于第20页的40页,则应显示以下链接:1,2 ... 18,19,[20],21,22 ... 39,40。解决方案类似于这里描述的那个:
http://90poe.com/alex-lee-on-bell-curve-pagination
我已经看到在PHP中执行此操作的代码,但在ASP.net中没有(理想情况下我正在寻找C#代码)。如果有人之前做过这样的事情,那么查看你的代码会非常有帮助。
答案 0 :(得分:3)
生成分页链接所需的代码在很大程度上取决于您使用的基于ASP.NET的技术。使用ASP.NET MVC时需要不同的代码,Web窗体的代码不同,Repeater
或Grid
等控件的代码也不同。
无论如何,您需要生成要显示的页码。以下代码显示了如何使用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;
}