使用扩展方法生成ASP.NET MVC通用分页页码导航源码

使用扩展方法生成ASP.NET MVC通用分页页码导航源码

4914发表于2015-06-09

今天我来分享下自己写的,使用扩展方法实现生成ASP.NET mvc通用分页页码导航源码。展示一个数据量多的表时分页是非常有必要,既可以减少一次一数据请求又可以提高用户检验,因为当一表数据全部无论查询数据库还是加载到页面来会很慢。

之前用EF框架的时候用了PagedList来分页,它可以快速自己给你生成分页数据和生成分页页码。


这个组件其实也很不错的。对于这个组件的使用请看:跟蓝狐学MVC教程--ASP.NET MVC分页组件PagedList.Mvc在EF中的使用方法

今天我试着自己写了一个生成分页导航的HtmlHelper扩展方法,详细步骤和源码如下

1、定义一个用来装载适合所有类的分页结果类

public class PageDataView<T>
{
	 private int _TotalNum;
	 public PageDataView()
	{
		this._Items = new List<T>();
	}
	public int TotalNum
	{
		get { return _TotalNum; }
		set { _TotalNum = value; }
	}
	private IList<T> _Items;
	public IList<T> Items
	{
		get { return _Items; }
		set { _Items = value; }
	}
	public int CurrentPage { get; set; }
	public int TotalPageCount { get; set; }
}
PageDataView的Items一个泛型属性,所以可以适合所有的类,简洁而通用。

2、扩展HtmlHelper生成分页页码导航html

在命名空间“lanhuCMS.Infrastructure”定义一个类PagingHelpers,HtmlHelper 的扩展方法PageLinks:

public static class PagingHelpers
{
	public static MvcHtmlString PageLinks<T>(this HtmlHelper html,PageDataView<T> pageData,Func<int, string> pageUrl,int showMaxPageNum = 10
)
	{
		string tplPageNumLink = "<a href=\"{0}\">{1}</a>";
		string tmplPageNumLinkCurrent = "<span class=\"current\">{0}</span>";
		StringBuilder result = new StringBuilder();
		if (pageData.TotalPageCount > 1)
		{
			result.AppendFormat(@"第 {0} 页,共 {1} 页,共{2}条", (pageData.TotalPageCount < pageData.CurrentPage ? 0 : pageData.CurrentPage)
														, pageData.TotalPageCount
														, pageData.TotalNum);
			int showStartPageNum, showEndPageNum;
			if (pageData.CurrentPage <= 1)
			{
				showStartPageNum = 1;
				showEndPageNum = showMaxPageNum;
				if (showEndPageNum > pageData.TotalPageCount)
					showEndPageNum = pageData.TotalPageCount;
			}
			else if (pageData.CurrentPage >= pageData.TotalPageCount)
			{
				showStartPageNum = pageData.TotalPageCount - showMaxPageNum + 1;
				showEndPageNum = pageData.TotalPageCount;
				if (showStartPageNum <= 0)
					showStartPageNum = 1;
			}
			else
			{
				int beforeCount = Convert.ToInt32(Math.Ceiling(showMaxPageNum * 1.0 / 2));
				showStartPageNum = pageData.CurrentPage - beforeCount;
				if (showStartPageNum <= 0)
					showStartPageNum = 1;
				showEndPageNum = showStartPageNum + showMaxPageNum - 1;
				if (showEndPageNum > pageData.TotalPageCount)
					showEndPageNum = pageData.TotalPageCount;
				if (showStartPageNum > pageData.TotalPageCount)
					showEndPageNum = pageData.TotalPageCount;
			}
			result.AppendFormat(tplPageNumLink, pageUrl(1), "首页");
			if (pageData.CurrentPage > 1)
			{
				result.AppendFormat(tplPageNumLink, pageUrl(pageData.CurrentPage - 1), "上一页");
			}
			for (int i = showStartPageNum; i <= showEndPageNum; i++)
			{
				if (i == pageData.CurrentPage)
					result.AppendFormat(tmplPageNumLinkCurrent, i);
				else
					result.AppendFormat(tplPageNumLink, pageUrl(i), i);
			}
			if (pageData.CurrentPage < pageData.TotalPageCount)
			{
				result.AppendFormat(tplPageNumLink, pageUrl(pageData.CurrentPage + 1), "下一页");
			}
			result.AppendFormat(tplPageNumLink, pageUrl(pageData.TotalPageCount), "末页");
		}
		return MvcHtmlString.Create(result.ToString());
	}
}
PageLinks是HtmlHelper的扩展方法,作用是根据数据自动生成分页导航的相关部分的html。

3、在要分页的视图中使用调用这个分页页码组件

<div class="pagination">
    @Html.PageLinks(Model, p => string.Format("/Admin?name={0}&loginName={1}&page={2}", ViewBag.Name,@ViewBag.LoginName, p), 10)
</div>

页面分页的效果为:

注意:在视图的头部要引入下面代码,你要根据你的model命名空间进行相应的调整:


@model lanhuCMS.Models.PageDataView<lanhuCMS.Models.CMS_Product>
@using lanhuCMS.Infrastructure



要看我写的这个分页页码组件在一个程序中的完整实例,可以参考:dapper通用万能的泛型mvc分页实例

小编蓝狐