发表于2015-06-09
今天我来分享下自己写的,使用扩展方法实现生成ASP.NET mvc通用分页页码导航源码。展示一个数据量多的表时分页是非常有必要,既可以减少一次一数据请求又可以提高用户检验,因为当一表数据全部无论查询数据库还是加载到页面来会很慢。
之前用EF框架的时候用了PagedList来分页,它可以快速自己给你生成分页数据和生成分页页码。
这个组件其实也很不错的。对于这个组件的使用请看:跟蓝狐学MVC教程--ASP.NET MVC分页组件PagedList.Mvc在EF中的使用方法
今天我试着自己写了一个生成分页导航的HtmlHelper扩展方法,详细步骤和源码如下
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一个泛型属性,所以可以适合所有的类,简洁而通用。
在命名空间“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。
<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