自定义使用 Repeater 和 SQL 的分页
自定义使用 Repeater 和 SQL 的分页
我一直在寻找一个好的教程,教我如何使用简单的DataBound控件(如Repeater)制作一个定制的分页控件,以实现高性能的分页功能。我找到了很多关于这个问题的文章,但没有一个完整的答案。
- ASP.NET中大结果集的分页
这篇文章非常棒,对不同的方法进行了统计和比较,但问题是它太旧了,在SQL Server拥有新的ROW_NUMBER()函数之前。
- ASP.NET 3.5多层Web应用程序第4部分:排序、分页和过滤(数据库分页部分,忽略其余部分)
这篇文章几乎完美,但他使用了网格控件的现有分页功能,并使用了自定义的分页方法,而不是使用Repeater。
- 使用ASP.NET Repeater或DataList控件的自定义SEO友好分页
我认为这篇文章太复杂了,事情可以更简单地完成。
我使用的是SQL,Items Repeater(在code-behind中直接绑定,不使用数据源),PageNumbers Repeater(它将有一个链接作为ItemTemplate,用于传递查询字符串,以便使用的方法可以检索下一部分Items),一个标签来保存当前页码和标题。
我一直在尝试实现ASP.NET 3.5多层Web应用程序第4部分:排序、分页和过滤(数据库分页部分,忽略其余部分)中的示例。到目前为止,我在我的数据访问层中创建了一个类似这样的SQL命令:
WITH Records AS ( SELECT ItemId, ItemName, ROW_NUMBER() OVER (ORDER BY ItemId) AS 'RowNumber' FROM Items) SELECT * FROM Records WHERE (RowNumber BETWEEN (@startIndex) AND @startIndex + @pageSize - 1)
但是我现在无法在我的表现层中使用它!
自定义分页与Repeater和SQL的问题的原因是需要自定义一个渲染分页控件的方法。解决方法是创建一个名为RenderPaginationControl的方法,接受参数page、pageSize和totalItems,返回一个分页控件的HTML代码。
在使用Repeater绑定数据时,需要调用一个名为GetTotalNumberOfItems的方法获取总数据项数,并将其作为参数传递给RenderPaginationControl方法。此外,在GetItems方法中存在一个小错误,缺少一个表示起始索引的参数,可以通过在URL中添加一个名为start的QueryString参数,并在方法中使用一个名为startIndex的变量,并根据pageSize递增startIndex的值来解决这个问题。
关于使用Ajax,可以尝试使用Server Control,如LinkButton,来触发PostBack并实现Ajax功能。
至于计算startIndex的问题,在DAL.GetItems方法中计算startIndex,公式为startIndex = page * pageSize + 1。