关于asp.net mvc的分页,网上已经有很多了。本来也想借用,先看了杨涛写的分页控件,感觉用起来稍微有点复杂,而我只需要简单的分页。分页我写过很多次,原理也熟悉,就是构造首页、上一页、下一页及末页的链接,做得好点,还可以有页码、下拉分页等。于是我又造了一个轮子。
先准备数据,这里以人员信息为例:
public class PersonInfo { public string Name { get; set; } public int Age { get; set; } }
初始化100条数据,并提供一个方法,可以从这些数据中按照分页大小和页码获取。
public class PersonHelper { private static List<PersonInfo> list; static PersonHelper() { list = new List<PersonInfo>(); for (int i = 0; i < 100; i++) { list.Add(new PersonInfo() { Name = "姓名" + i.ToString(), Age = 18 + i }); } } /// <summary> /// /// </summary> /// <returns></returns> public static IEnumerable<PersonInfo> GetList(int pageSize, int pageIndex) { return list.Skip((pageIndex - 1) * pageSize).Take(pageSize); } }
Model定义:其中包含了分页大小、当前页码、记录数和人员信息集合。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using MvcApplication2.Code; namespace MvcApplication2.Models { public class PersonListModels { public int PageIndex { get; set; } public int PageSize { set; get; } public int RecordCount { get; set; } public IEnumerable<PersonInfo> Persons { get; set; } } }
Controller中的处理:
public ActionResult PersonList(int? pageIndex) { // 分页大小 int pageSize = 10; // 获取分页页码 if (pageIndex == null || pageIndex <= 0) { pageIndex = 1; } // 获取分页数据 IEnumerable<PersonInfo> query = PersonHelper.GetList(pageSize, pageIndex.Value); // 设置模型 NewsModels model = new NewsModels() { Persons = query, PageIndex = pageIndex.Value, PageSize = pageSize, RecordCount = 100 }; return View(model); }
View中处理:
@model MvcApplication2.Models.PersonListModels @{ ViewBag.Title = "Person List"; } <h2> Person List</h2> <table> @foreach (MvcApplication2.Code.PersonInfo info in Model.Persons) { <tr> <td>@info.Name </td> <td>@info.Age </td> </tr> } <tr> <td colspan="2"> @Url.Pager("Home", "PersonList", Model.PageSize, Model.PageIndex, Model.RecordCount) </td> </tr> </table>
重点就在@Url.Pager的使用了。扩展UrlHelper的代码如下:
namespace System.Web.Mvc { public static class HtmlExtend { /// <summary> /// 扩展UrlHelper,实现输出分页HTML /// </summary> /// <param name="urlHelper"></param> /// <param name="controllerName">控制器名</param> /// <param name="actionName">行为名</param> /// <param name="pageSize">分页大小</param> /// <param name="pageIndex">当前页码</param> /// <param name="recordCount">总记录数</param> /// <returns></returns> public static MvcHtmlString Pager(this UrlHelper urlHelper, string controllerName, string actionName, int pageSize, int pageIndex, int recordCount) { // 如果分页大小等于0,则返回空字符串 if (pageSize == 0) { return MvcHtmlString.Create(string.Empty); } // 根据总记录数和分页大小计算出分页数量 int pageCount = (int)decimal.Ceiling((decimal)recordCount / (decimal)pageSize); // 首页、末页 string firstStr = string.Empty; string lastStr = string.Empty; if (recordCount > 0) { string firstUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = 1 }); firstStr = "<a href='" + firstUrl + "'>首页</a>"; string lastUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = pageCount }); lastStr = "<a href='" + lastUrl + "'>末页</a>"; } else { firstStr = "首页"; lastStr = "末页"; } // 上一页 string preStr = string.Empty; if (pageIndex > 1 && pageIndex <= pageCount) { string prevUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = pageIndex - 1 }); preStr = "<a href='" + prevUrl + "'>上一页</a>"; } else { preStr = "上一页"; } // 下一页 string nextStr = string.Empty; if (pageIndex > 0 && pageIndex < pageCount) { string nextUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = pageIndex + 1 }); nextStr = "<a href='" + nextUrl + "'>下一页</a>"; } else { nextStr = "下一页"; } // 页码 string numStr = string.Empty; if (pageCount > 0) { // 遍历输出全部的页码 for (int i = 1; i <= pageCount; i++) { string numUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = i }); // 当前页码加粗 if (i == pageIndex) { numStr += "[<a href='" + numUrl + "'><strong>" + i + "</strong></a>] "; } else { numStr += "[<a href='" + numUrl + "'>" + i + "</a>] "; } } } string pageStr = firstStr + " " + preStr + " " + numStr + nextStr + " " + lastStr; return MvcHtmlString.Create(pageStr); } } }
看看效果:
文中的源码没有实现页码分段显示,有兴趣的朋友可以自己试试,或者猛烈点击下载完整版。
你是否想过访问的网址除了分页之外还有其它url参数的情况?这样岂不是全部丢掉了?
另外这个貌似应该写为HtmlHelper的扩展方法,Url是管网址的,不是管生成代码的。
确实存在这两方面的问题,下一步会改进。十分感谢您的留言。
逛了博主的博客 看来自己还有很长的学习路啊
共勉!
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论