我想实现一个分页系统,显示附近的页码以及页面在每个极端。例如,如果用户在40页的第20页上,应该显示以下链接:1,2,...,18,19,[20],21,22 ... 39,40.该解决方案将类似于这里所描述的:生成分页链接
http://90poe.com/alex-lee-on-bell-curve-pagination
我见过的代码来做到这一点在PHP中,而不是在ASP.net(理想情况下我找的C#代码)。如果以前有人做过这样的事情,那么看到你的代码会非常有帮助。
我想实现一个分页系统,显示附近的页码以及页面在每个极端。例如,如果用户在40页的第20页上,应该显示以下链接:1,2,...,18,19,[20],21,22 ... 39,40.该解决方案将类似于这里所描述的:生成分页链接
http://90poe.com/alex-lee-on-bell-curve-pagination
我见过的代码来做到这一点在PHP中,而不是在ASP.net(理想情况下我找的C#代码)。如果以前有人做过这样的事情,那么看到你的代码会非常有帮助。
您需要用来生成分页链接的代码很大程度上取决于您使用的是基于ASP.NET的技术。使用ASP.NET MVC时需要不同的代码,Web窗体的不同代码以及不同的控制代码,如Repeater
或Grid
。
无论如何,您需要生成要显示的页码。以下代码显示了如何使用LINQ和C#3.0来完成此操作。我们首先产生的所有范围(年初,围绕当前页面,结束),然后删除无效的页面(如MAX + 1),并确保每个页面返回只有一次:
// 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
s,但可能很难得到所有的案件,所以这可能是更优雅的方法。虽然将它绑定到特定技术可能是另一个问题的主题。
谢谢。我有权访问LINQ,所以我试图使用这种解决方案,但是我在开始“Enumerable.Range”的行上遇到以下错误:无法将类型'System.Collections.Generic.IEnumerable
@alpheus:'pages'的类型需要是'IEnumerable
嗯,我不认为这是有效的,我说,它显示了不存在的高范围页面。 – mmcglynn 2013-10-22 12:43:55
我第二个托马斯的解决方案。
如果你不能使用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;
}
在您链接到网页,图片显示不出来。 – 2010-05-27 18:44:27
第5页共40页的链接页面是什么? – Sijin 2010-05-27 18:57:28
对于40中的5个,链接将是:1,2,3,4,[5],6,7 ... 39,40.(前两个总是显示,最后两个始终显示,并且两个直接相邻的总是显示。) – alpheus 2010-05-27 19:04:52