使用MVCPager进行博客园首页列表数据的分页显示功能

简介: 在前一篇博客中使用正则表达式抓取博客园列表数据,我通过正则表达式抓取了博客园的部分数据作为测试数据,现在测试数据也有了,就应该进行数据的分页显示了。 但是如何分页这倒是让我犹豫了好几分钟,是自己写javascript来自定义分页显示,还是通过现成的控件来进行分页,通过自定义分页可以完全的对分页进行控制,但是会很耗费时间,这对于js功能很差的我就是个难题,但是为了尽快的能实现这个分页功能,我依然采用了分页控件进行分页,如果以后有机会我再手动写一个分页js来进行分页。

在前一篇博客中使用正则表达式抓取博客园列表数据,我通过正则表达式抓取了博客园的部分数据作为测试数据,现在测试数据也有了,就应该进行数据的分页显示了。

但是如何分页这倒是让我犹豫了好几分钟,是自己写javascript来自定义分页显示,还是通过现成的控件来进行分页,通过自定义分页可以完全的对分页进行控制,但是会很耗费时间,这对于js功能很差的我就是个难题,但是为了尽快的能实现这个分页功能,我依然采用了分页控件进行分页,如果以后有机会我再手动写一个分页js来进行分页。

因为我使用的是MVC 3 Razor引擎,所以我找了一个我在web form时代使用的aspNetPager同一个作者的MvcPager控件。不得不说这个控件确实挺强大的,我也慢慢的探索着在我的Mvc系统中实现了分页功能。

作为MvcPager的使用者,虽然作者的官网有很多实例,但是那都是单独的实例,不具有完整性,所以我来介绍一下我在系统中使用MvcPager的过程,如果有什么说的不对的地方,还请大家指点。

首先,我们应该获取MvcPager控件的程序集,但是我们最好不要直接获取程序集,而是要获取MvcPager的源代码,因为我们要对他的源代码进行部分的修改,以更合适的使用它。

下载好了MVcPager源代码以后,我们就先来修改一下那个分页使用的类PagedList。

 1 public class PagedList<T> : List<T>,IPagedList
 2     {
 3         public PagedList(IList<T> items, int pageIndex, int pageSize)//这是IList类型
 4         {
 5             PageSize = pageSize;
 6             TotalItemCount = items.Count;
 7             CurrentPageIndex = pageIndex;
 8             for (int i = StartRecordIndex - 1; i < EndRecordIndex; i++)
 9             {
10                 Add(items[i]);
11             }
12         }
13 
14         public PagedList(IEnumerable<T> items, int pageIndex, int pageSize, int totalItemCount)//这是IEnumerable类型,
//我们使用C#语言,所以要多添加这么一个类型
15 { 16 AddRange(items); 17 TotalItemCount = totalItemCount; 18 CurrentPageIndex = pageIndex; 19 PageSize = pageSize; 20 } 21 22 public int CurrentPageIndex { get; set; } 23 public int PageSize { get; set; } 24 public int TotalItemCount { get; set; } 25 public int TotalPageCount { get { return (int)Math.Ceiling(TotalItemCount / (double)PageSize); } } 26 public int StartRecordIndex { get { return (CurrentPageIndex - 1) * PageSize + 1; } } 27 public int EndRecordIndex { get { return TotalItemCount > CurrentPageIndex * PageSize ? CurrentPageIndex * PageSize : TotalItemCount; } } 28 }

2.在我们修改了PagedList类以后,还要修改哪些地方呢?还有一个扩展方法,用来扩展PagedList

 1 public static class PageLinqExtensions
 2     {
 3         public static PagedList<T> ToPagedList<T>
 4             (
 5                 this IEnumerable<T> allItems,
 6                 int pageIndex,
 7                 int pageSize
 8             )
 9         {
10             if (pageIndex < 1)
11                 pageIndex = 1;
12             var itemIndex = (pageIndex-1) * pageSize;
13             var pageOfItems = allItems.Skip(itemIndex).Take(pageSize);
14             var totalItemCount = allItems.Count();
15             return new PagedList<T>(pageOfItems, pageIndex, pageSize, totalItemCount);
16         }
17     }

3.在我们修改了扩展方法以后,就可以在IEnumerable以后进行.ToPagedList<T>转换成PagedList 分页类

将获取到的分页列表数据转换为PagedList类型以后,我们就要使用MvcPager来进行分页显示

我们定义了博客列表显示Controller,将从数据库中获取到的列表数据通过MvcPager分页

 1 @{
 2     Layout = null;
 3 }
 4 @using Webdiyer.WebControls.Mvc
 5 @model PagedList<Models.BlogInfo>
 6 @{
 7     foreach (Models.BlogInfo blogInfo in Model)
 8     {
 9     <div class="post_item">
10         <div class="digg">
11             <div class="diggit">
12                 <span class="diggnum">0</span>
13             </div>
14             <div class="clear">
15             </div>
16             <div class="digg_tip">
17             </div>
18         </div>
19         <div class="post_item_body">
20             <h3>
21                 <a href="@blogInfo.LinkUrl" target="_blank" class="titlelink">@blogInfo.Title</a>
22             </h3>
23             <p class="post_iteme_summary">
24                 @blogInfo.BlogContent ...
25             </p>
26             <div class="post_item_foot">
27                 <a class="lightblue" href="@blogInfo.LinkUrl">@blogInfo.AuthorID</a>
28                 @blogInfo.PublishTime.ToString()
29                 <span class="article_comment"><a class="gray" title="">评论(0)</a> </span><span class="article_view">
30                     <a class="gray">阅读(1)</a> </span>
31             </div>
32         </div>
33         <div class="clear">
34         </div>
35     </div>
36     }
37     
38     @Html.AjaxPager(Model, new PagerOptions()
39        {
40            PageIndexParameterName = "id",
41            ShowDisabledPagerItems = false,
42            ShowPageIndexBox = true
43        },
44     new AjaxOptions() { UpdateTargetId = "post_list", OnBegin = "function(){alert('Ajax OnBegin 事件被引发');}", OnComplete = "AjaxStop" })
45 }

5.Html.AjaxPager()方法就是MvcPager的一个扩展方法,扩展了HtmlHelper。对于其中的几个参数我就不介绍了,也很容易理解。

6.有图有证据 下面我来展示一下我的系统分页显示

 

3.使用MVCPager进行分页显示,更详细的教程信息还是在官网,里面有这个控件可以实现的各种方法。我在这里只是介绍了一下我的分页设计

顺便说一句,我们程序员最忌讳的就是手高眼低,只有我们亲手敲进去了以后,才能知道会遇到什么问题?千万不要眼高手低!

索引:

使用正则表达式抓取博客园列表数据 (2012-12-15 22:16)            
Lucene.net 原理介绍以及使用方法 (2012-12-13 23:49)            
Asp.net MVC 使用Autofac的简单使用 IOC (2012-12-12 13:16)            
Asp.net MVC 仿照博客园的简单网站首页 列表设计 (2012-12-11 22:21)            
为什么要从Web form过渡到MVC中 (2012-12-09 22:43)            
Asp.net MVC3 企业网站系统高仿博客园 首页左侧列表页面 实现效果 (2012-12-08 19:11)            
Asp.net MVC 3 开发企业网站系统仿照博客园部分功能--总体设计 (2012-12-05 23:41)            
Asp.net MVC 3 开发简单的企业系统开篇--数据库 (2012-12-03 21:03)            
Asp.net MVC 3 开发一个简单的企业网站系统 (2012-12-02 21:09)
我又回来了,回到了技术最前线,
相关文章
|
11月前
|
算法 Java 数据库连接
.NET 内存管理两种有效的资源释放方式
【10月更文挑战第14天】在 .NET 中,`IDisposable` 接口提供了一种标准机制来释放非托管资源,如文件句柄、数据库连接等。此类资源需手动释放以避免泄漏。实现 `IDisposable` 的类可通过 `Dispose` 方法释放资源。使用 `using` 语句可确保资源自动释放。此外,.NET 的垃圾回收器会自动回收托管对象所占内存,提高程序效率。示例代码展示了如何使用 `MyFileHandler` 类处理文件操作并释放 `FileStream` 资源。
185 2
|
运维 Java 应用服务中间件
【Nginx异常】无法加载响应数据:No data found for resource with given identifier,后端服务报Caused by: java.io.IOExcepti
【Nginx异常】无法加载响应数据:No data found for resource with given identifier,后端服务报Caused by: java.io.IOExcepti
1703 0
|
SQL 关系型数据库 数据库连接
详解 Entity Framework(EF)核心组件与数据访问方法探索
Entity Framework是一个ORM框架,简化.NET开发者与数据库的交互。它始于.NET Framework的一部分,但现在可通过NuGet独立获取。ORM允许对象模型直接映射到数据库结构,避免直接编写SQL。
1643 2
详解 Entity Framework(EF)核心组件与数据访问方法探索
|
存储 SQL 测试技术
Entity Framework Core 中的存储过程超厉害!从定义到调用全攻略,提升性能与安全性!
【8月更文挑战第31天】在现代软件开发中,数据库操作效率至关重要。Entity Framework Core(EF Core)作为强大的对象关系映射(ORM)框架,支持存储过程,可提升数据库操作的性能、安全性和可维护性。本文详细介绍如何在 EF Core 中定义、配置及调用存储过程,并提供最佳实践建议,包括性能优化、安全性增强、代码可维护性提升以及参数化查询等。通过遵循这些指导原则,开发者能够充分利用存储过程的优势,显著提高应用程序质量和性能。附带完整示例代码,展示从定义实体类到调用存储过程的全过程。
721 0
|
JavaScript 前端开发 数据格式
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
717 0
|
安全 API 数据库
开源邮箱?十大开源邮件系统总有一款适合
开源邮箱?十大开源邮件系统总有一款适合
|
缓存 监控 算法
【专栏】.NET 开发:实现卓越性能的途径
【4月更文挑战第29天】本文探讨了.NET开发中的性能优化,强调了理解性能问题根源和使用分析工具的重要性。基础优化包括代码优化(如减少计算、避免内存泄漏)、资源管理及选择合适算法。高级策略涉及并行编程、缓存策略、预编译(AOT)和微服务架构。持续性能测试与监控是关键,包括性能测试、监控分析和建立优化反馈循环。开发者应持续学习和实践性能优化,以构建高性能应用。
176 0
|
存储 监控 机器人
JavaRobot如何实现屏幕截图
屏幕截图是日常开发中常见且重要的功能之一,而JavaRobot提供了一种简便且高效的方式来实现屏幕截图。本文将介绍JavaRobot如何实现屏幕截图的步骤和方法。
391 0
|
Java 数据库连接 数据库
深入了解Java中的MyBatis Plus注解 @IdType:优雅处理主键生成策略
在数据库表设计中,主键是一项非常关键的概念,而主键生成策略则是决定如何生成主键值的重要环节之一。MyBatis Plus作为一款强大的ORM框架,提供了注解 `@IdType`,使得开发者能够更加灵活地处理主键生成策略,同时降低了代码的冗余度。本文将详细介绍 `@IdType` 注解的用法及其在持久层开发中的应用。
2463 0