关于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大全
文章分类
最新评论