using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcTest.Extends { /// <summary> /// 分页元素位置 /// </summary> public enum PagerElementPosition { Left, Right } public class PagerConfig { /// <summary> /// 记录总条数 /// </summary> public int TotalRecord { get; set; } /// <summary> /// 记录的单位,默认为“条” /// </summary> public string RecordUnit { get; set; } /// <summary> /// 记录的名称,默认为“记录” /// </summary> public string RecordName { get; set; } /// <summary> /// 当前页码的参数名 /// </summary> public string CurrentPageKey { get; set; } /// <summary> /// 当前页码 只读 /// </summary> public int CurrentPage { get { if (HttpContext.Current.Request.Params[CurrentPageKey] == null) { return 1; } else { try { int currentPage = Convert.ToInt32(HttpContext.Current.Request.Params[CurrentPageKey]); if (currentPage < 1) { return 1; } else if (currentPage > TotalPage) { return TotalPage; } else { return currentPage; } } catch { return 1; } } } } private int _PageSize; /// <summary> /// 每页显示记录数 /// </summary> public int PageSize { get { return _PageSize; } set { if (value < 1) { _PageSize = 1; } else { _PageSize = value; } } } /// <summary> /// 总页数 只读 /// </summary> public int TotalPage { get { return (int)Math.Ceiling(TotalRecord / (double)PageSize); } } /// <summary> /// 是否显示首页、尾页链接 /// </summary> public bool ShowFirstLastPageLink { get; set; } /// <summary> /// 是否显示上一页、下一页链接 /// </summary> public bool ShowPrevNextPageLink { get; set; } /// <summary> /// 是否显示数字按钮 /// </summary> public bool ShowDigitalLink { get; set; } /// <summary> /// 数字按钮数量 /// </summary> public int DigitalLinkCount { get; set; } /// <summary> /// 是否显示总记录数 /// </summary> public bool ShowTotalRecord { get; set; } /// <summary> /// 总记录数出现位置 /// </summary> public PagerElementPosition TotalRecordPosition { get; set; } /// <summary> /// 是否显示当前页数和总页数信息 /// </summary> public bool ShowPageInfo { get; set; } /// <summary> /// 当前页和总页数信息显示位置 /// </summary> public PagerElementPosition PageInfoPosition { get; set; } /// <summary> /// 是否显示GoTo输入区域 /// </summary> public bool ShowGoTo { get; set; } /// <summary> /// 指定生成的元素对应的class的前缀字符 /// </summary> public string CssClassPreWord { get; set; } /// <summary> /// 是否创建为ajax分页控件 /// </summary> public bool UseAjax { get; set; } /// <summary> /// Ajax提交后更新的html元素id /// </summary> public string AjaxUpdateTargetID { get; set; } /// <summary> /// Ajax提交后调用的js function名称 /// </summary> public string AjaxSuccessFunctionName { get; set; } /// <summary> /// 是否自动生成Ajax提交后调用的js function /// </summary> public bool AutoGenarateAjaxSuccessFunction { get; set; } /// <summary> /// 使用默认值初始化设置 /// </summary> public PagerConfig() { PageSize = 4; RecordUnit = "条"; RecordName = "记录"; CurrentPageKey = "page"; CssClassPreWord = "pager"; ShowFirstLastPageLink = true; ShowPrevNextPageLink = true; ShowDigitalLink = true; DigitalLinkCount = 10; ShowTotalRecord = false; TotalRecordPosition = PagerElementPosition.Left; ShowPageInfo = false; PageInfoPosition = PagerElementPosition.Left; ShowGoTo = false; UseAjax = false; AjaxUpdateTargetID = ""; AjaxSuccessFunctionName = "OnPageChanged"; AutoGenarateAjaxSuccessFunction = true; } } /// <summary> /// 配合Pager扩展实现分页的帮助类 /// </summary> public class PagerHelper { /// <summary> /// 获取记录开始和结束编号,并返回实际的页码 /// </summary> /// <param name="allCount">记录总条数</param> /// <param name="pageSize">页大小</param> /// <param name="pageIndex">(输出)当前页码</param> /// <param name="startIndex">(输出)开始编号</param> /// <param name="endIndex">(输出)结束编号</param> /// <param name="currentPageKey">分页参数名称</param> /// <param name="pageIndexIs0Based">页码编号是否从0开始,默认为否</param> /// <param name="recordIndexIs0Based">记录编号是否从0开始,默认为否</param> public static void GetStartAndEndIndex(int allCount, int pageSize, out int pageIndex, out int startIndex, out int endIndex, string currentPageKey = "page", bool pageIndexIs0Based = false, bool recordIndexIs0Based = false) { //计算pageIndex的实际值 pageIndex = GetRealPageIndex(allCount, pageSize, currentPageKey, pageIndexIs0Based); //计算过程是0based的 if (!pageIndexIs0Based) { pageIndex--; //转成0based } //计算startIndex和endIndex startIndex = pageIndex * pageSize; endIndex = startIndex + pageSize - 1; if (endIndex > allCount - 1) { endIndex = allCount - 1; } //0based计算完成,下面根据设置不同,输出不同 if (!pageIndexIs0Based) { pageIndex++; } if (!recordIndexIs0Based) { startIndex++; endIndex++; } } /// <summary> /// 返回实际页码 /// </summary> /// <param name="allCount">总记录数</param> /// <param name="pageSize">页面大小</param> /// <param name="currentPageKey">分页参数名称</param> /// <param name="pageIndexIs0Based">页码编号是否从0开始,默认为否</param> /// <returns>实际页码</returns> public static int GetRealPageIndex(int allCount, int pageSize, string currentPageKey = "page", bool pageIndexIs0Based = false) { int pageIndex; //整个计算过程都是0based的 if (pageSize < 1) { pageSize = 1; //容错 } if (HttpContext.Current.Request.Params[currentPageKey] == null) { pageIndex = 0; } else { try { int _pageIndex = Convert.ToInt32(HttpContext.Current.Request.Params[currentPageKey]); //待判断的页码 if (!pageIndexIs0Based) { _pageIndex--; //转成0based } if (_pageIndex < 0) { pageIndex = 0; } else { int totalPage = (int)Math.Ceiling(allCount / (double)pageSize); if (_pageIndex >= totalPage) { pageIndex = totalPage - 1; } else { pageIndex = _pageIndex; } } } catch { pageIndex = 0; } } //0based计算完成,下面根据设置不同,输出不同 return (pageIndexIs0Based) ? pageIndex : pageIndex + 1; } } }
using MvcTest.Extends; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MvcTest.HTML { public static class PagerExtensions { //提取 返回a标签 方法 private static string getLinkHtml(UrlHelper urlHelper, bool useAjax, string ajaxSuccessFunction, string linkContent, string actionName, string controllerName, RouteValueDictionary routeValues) { string link = ""; if (useAjax) { link += "<a href=\"javascript:$.post('" + urlHelper.Action(actionName, controllerName) + "',{"; //将route放到post表单中 foreach (var route in routeValues.Keys) { link += route + ":'" + routeValues[route].ToString() + "',"; } if (routeValues.Count > 0) { link = link.Remove(link.Length - 1); } link += "}," + ajaxSuccessFunction + ")\" >"; } else { link += "<a href=\"" + urlHelper.Action(actionName, controllerName, routeValues) + "\">"; } link += linkContent; link += "</a>"; return link; } #region 分页扩展 /// <summary> /// 返回用于分页的div元素 /// </summary> /// <param name="htmlHelper">HtmlHelper</param> /// <param name="pagerConfig">分页设置对象</param> /// <returns></returns> public static MvcHtmlString Pager(this HtmlHelper htmlHelper, PagerConfig pagerConfig) { return Pager(htmlHelper, "", "", new { }, new { }, pagerConfig); } /// <summary> /// 返回用于分页的div元素 /// </summary> /// <param name="htmlHelper">HtmlHelper</param> /// <param name="htmlAttributes">html属性对象</param> /// <param name="pagerConfig">分页设置对象</param> /// <returns></returns> public static MvcHtmlString Pager(this HtmlHelper htmlHelper, object htmlAttributes, PagerConfig pagerConfig) { return Pager(htmlHelper, "", "", new { }, htmlAttributes, pagerConfig); } /// <summary> /// 返回用于分页的div元素 /// </summary> /// <param name="htmlHelper">HtmlHelper</param> /// <param name="actionName">方法</param> /// <param name="htmlAttributes">html属性对象</param> /// <param name="pagerConfig">分页设置对象</param> /// <returns></returns> public static MvcHtmlString Pager(this HtmlHelper htmlHelper, string actionName, object htmlAttributes, PagerConfig pagerConfig) { return Pager(htmlHelper, actionName, "", new { }, htmlAttributes, pagerConfig); } /// <summary> /// 返回用于分页的div元素 /// </summary> /// <param name="htmlHelper">HtmlHelper</param> /// <param name="actionName">方法</param> /// <param name="controllerName">控制器</param> /// <param name="htmlAttributes">html属性对象</param> /// <param name="pagerConfig">分页设置对象</param> /// <returns></returns> public static MvcHtmlString Pager(this HtmlHelper htmlHelper, string actionName, string controllerName, object htmlAttributes, PagerConfig pagerConfig) { return Pager(htmlHelper, actionName, controllerName, new { }, htmlAttributes, pagerConfig); } /// <summary> /// 返回用于分页的div元素 /// </summary> /// <param name="htmlHelper">HtmlHelper</param> /// <param name="actionName">方法</param> /// <param name="controllerName">控制器</param> /// <param name="routeValues">路由参数</param> /// <param name="htmlAttributes">html属性对象</param> /// <param name="pagerConfig">分页设置对象</param> /// <returns></returns> public static MvcHtmlString Pager(this HtmlHelper htmlHelper, string actionName, string controllerName, object routeValues, object htmlAttributes, PagerConfig pagerConfig) { RouteValueDictionary RouteValues; if (routeValues == null) { RouteValues = new RouteValueDictionary(); } else { RouteValues = new RouteValueDictionary(routeValues); } UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext); AjaxHelper Ajax = new AjaxHelper(htmlHelper.ViewContext, htmlHelper.ViewDataContainer); StringBuilder sbPager = new StringBuilder(); sbPager.Append("<div"); //利用反射获取htmlAttributes的全部元素和值 if (htmlAttributes != null) { System.Reflection.PropertyInfo[] htmlProperties = (System.Reflection.PropertyInfo[])htmlAttributes.GetType().GetProperties(); foreach (var property in htmlProperties) { sbPager.Append(" " + property.Name + "=\"" + property.GetValue(htmlAttributes).ToString() + "\""); } } sbPager.Append(">"); //左侧记录总数信息 if (pagerConfig.ShowTotalRecord && pagerConfig.PageInfoPosition == PagerElementPosition.Left) { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-count\">共" + pagerConfig.TotalRecord + pagerConfig.RecordUnit + pagerConfig.RecordName + "</span>"); } //左侧页码信息 if (pagerConfig.ShowPageInfo && pagerConfig.PageInfoPosition == PagerElementPosition.Left) { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-info\">第" + pagerConfig.CurrentPage + "页/共" + pagerConfig.TotalPage + "页</span>"); } //首页 if (pagerConfig.ShowFirstLastPageLink) { if (pagerConfig.CurrentPage > 1) { RouteValues[pagerConfig.CurrentPageKey] = 1; sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-btn\">" + getLinkHtml(Url, pagerConfig.UseAjax, pagerConfig.AjaxSuccessFunctionName, "首页", actionName, controllerName, RouteValues) + "</span>"); } else { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-btn\">首页</span>"); } } //上一页 if (pagerConfig.ShowPrevNextPageLink) { if (pagerConfig.CurrentPage > 1) { RouteValues[pagerConfig.CurrentPageKey] = pagerConfig.CurrentPage - 1; sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-btn\">" + getLinkHtml(Url, pagerConfig.UseAjax, pagerConfig.AjaxSuccessFunctionName, "上一页", actionName, controllerName, RouteValues) + "</span>"); } else { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-btn\">上一页</span>"); } } //数字导航开始 if (pagerConfig.ShowDigitalLink) { int shownStartPageIndex, shownEndPageIndex; //总页数少于要显示的页数,页码全部显示 if (pagerConfig.DigitalLinkCount >= pagerConfig.TotalPage) { shownStartPageIndex = 1; shownEndPageIndex = pagerConfig.TotalPage; } else//显示指定数量的页码 { int forward = (int)Math.Ceiling(pagerConfig.DigitalLinkCount / 2.0); if (pagerConfig.CurrentPage > forward)//起始页码大于1 { shownEndPageIndex = pagerConfig.CurrentPage + pagerConfig.DigitalLinkCount - forward; if (shownEndPageIndex > pagerConfig.TotalPage)//结束页码大于总页码结束页码为最后一页 { shownStartPageIndex = pagerConfig.TotalPage - pagerConfig.DigitalLinkCount + 1; shownEndPageIndex = pagerConfig.TotalPage; } else { shownStartPageIndex = pagerConfig.CurrentPage - forward + 1; } } else//起始页码从1开始 { shownStartPageIndex = 1; shownEndPageIndex = pagerConfig.DigitalLinkCount; } } //向上… if (shownStartPageIndex > 1) { RouteValues[pagerConfig.CurrentPageKey] = shownStartPageIndex - 1; sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-number\">" + getLinkHtml(Url, pagerConfig.UseAjax, pagerConfig.AjaxSuccessFunctionName, "...", actionName, controllerName, RouteValues) + "</span>"); } //数字 for (int i = shownStartPageIndex; i <= shownEndPageIndex; i++) { if (i != pagerConfig.CurrentPage) { RouteValues[pagerConfig.CurrentPageKey] = i; sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-number\">" + getLinkHtml(Url, pagerConfig.UseAjax, pagerConfig.AjaxSuccessFunctionName, i.ToString(), actionName, controllerName, RouteValues) + "</span>"); } else { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-number " + pagerConfig.CssClassPreWord + "-currentnum\">" + i.ToString() + "</span>"); } } //向下… if (shownEndPageIndex < pagerConfig.TotalPage) { RouteValues[pagerConfig.CurrentPageKey] = shownEndPageIndex + 1; sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-number\">" + getLinkHtml(Url, pagerConfig.UseAjax, pagerConfig.AjaxSuccessFunctionName, "...", actionName, controllerName, RouteValues) + "</span>"); } } ////数字导航结束 //下一页 if (pagerConfig.ShowPrevNextPageLink) { if (pagerConfig.CurrentPage < pagerConfig.TotalPage) { RouteValues[pagerConfig.CurrentPageKey] = pagerConfig.CurrentPage + 1; sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-btn\">" + getLinkHtml(Url, pagerConfig.UseAjax, pagerConfig.AjaxSuccessFunctionName, "下一页", actionName, controllerName, RouteValues) + "</span>"); } else { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-btn\">下一页</span>"); } } //尾页 if (pagerConfig.ShowFirstLastPageLink) { if (pagerConfig.CurrentPage < pagerConfig.TotalPage) { RouteValues[pagerConfig.CurrentPageKey] = pagerConfig.TotalPage; sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-btn\">" + getLinkHtml(Url, pagerConfig.UseAjax, pagerConfig.AjaxSuccessFunctionName, "尾页", actionName, controllerName, RouteValues) + "</span>"); } else { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-btn\">尾页</span>"); } } //右侧记录总数信息 if (pagerConfig.ShowTotalRecord && pagerConfig.PageInfoPosition == PagerElementPosition.Right) { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-count\">共" + pagerConfig.TotalRecord + pagerConfig.RecordUnit + pagerConfig.RecordName + "</span>"); } //右侧页码信息 if (pagerConfig.ShowPageInfo && pagerConfig.PageInfoPosition == PagerElementPosition.Right) { sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-info\">第" + pagerConfig.CurrentPage + "页/共" + pagerConfig.TotalPage + "页</span>"); } //页码输入框 if (pagerConfig.ShowGoTo) { RouteValues[pagerConfig.CurrentPageKey] = "--pageRouteValue--"; sbPager.Append("<span class=\"" + pagerConfig.CssClassPreWord + "-goto\">转到第<input class=\"" + pagerConfig.CssClassPreWord + "-goto-input\" type=\"text\" url=\"" + Url.Action(actionName, controllerName, RouteValues) + "\" />页"); if (pagerConfig.UseAjax) { sbPager.Append("<input class=\"" + pagerConfig.CssClassPreWord + "-goto-submit\" type=\"button\" value=\"GO\" onclick=\"$.post( $(this).prev().attr('url').replace('--pageRouteValue--',$(this).prev().val())," + pagerConfig.AjaxSuccessFunctionName + ")\" /></span>"); } else { sbPager.Append("<input class=\"" + pagerConfig.CssClassPreWord + "-goto-submit\" type=\"button\" value=\"GO\" onclick=\"window.location = $(this).prev().attr('url').replace('--pageRouteValue--',$(this).prev().val());\" /></span>"); } } //ajax分页回调函数 if (pagerConfig.UseAjax) { if (pagerConfig.AutoGenarateAjaxSuccessFunction) { sbPager.Append("<script type=\"text/javascript\">function " + pagerConfig.AjaxSuccessFunctionName + "(data){$('#" + pagerConfig.AjaxUpdateTargetID + "').html(data);}</script>"); } } sbPager.Append("</div>"); return MvcHtmlString.Create(sbPager.ToString()); } #endregion } }
调用
public ActionResult Index() { int pageSize = 4; int allCount = db.Movies.Count(); ViewBag.Num = allCount; ViewBag.PageSize = pageSize; int pageIndex, startIndex, endIndex; //获取开始和结束的记录序号 PagerHelper.GetStartAndEndIndex(allCount, pageSize, out pageIndex, out startIndex, out endIndex); //调用存储过程返回指定序号范围的数据 // return View(db.SelectUserList(startIndex, endIndex)); var sear = (from m in db.Movies where m.ID >= startIndex && m.ID <= endIndex select m).ToList(); return View(sear); //return View(db.Movies.ToList()); }
@Html.Pager("Index", "Movies", new { }, new PagerConfig { TotalRecord = ViewBag.Num, PageSize = ViewBag.PageSize })