PageHelper using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.Collections.Specialized; namespace TW.Product.Helper { /// <summary> /// 分页模式 /// </summary> public enum PagerMode { /// <summary> /// 普通分页模式 /// </summary> Normal } /// <summary> /// 扩展类 /// </summary> public static class PagerHelper { /// <summary> /// /// </summary> /// <param name="helper"></param> /// <param name="oModel">ViewData["pagerModel"]</param> /// <returns></returns> public static string Pager(Object oModel) { PagerModel model = oModel as PagerModel; return Pager(model.id, model.mode, model.currentPageIndex, model.pageSize, model.recordCount, model.className); } /// <summary> /// 分页 /// </summary> /// <param name="helper"></param> /// <param name="id">分页id</param> /// <param name="currentPageIndex">当前页</param> /// <param name="pageSize">分页尺寸</param> /// <param name="recordCount">记录总数</param> /// <param name="htmlAttributes">分页头标签属性</param> /// <param name="className">分页样式</param> /// <param name="mode">分页模式</param> /// <returns></returns> private static string Pager(string id, PagerMode mode, int currentPageIndex, int pageSize, int recordCount, string className) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("<table id=\"{0}\" class=\"{1}\"><tr><td>", id, className); sb.Append(GetNormalPage(id, currentPageIndex, pageSize, recordCount, mode)); sb.Append("</td><tr></table>"); //builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); return sb.ToString(); } /// <summary> /// 获取普通分页 /// </summary> /// <param name="currentPageIndex"></param> /// <param name="pageSize"></param> /// <param name="recordCount"></param> /// <returns></returns> private static string GetNormalPage(string id, int currentPageIndex, int pageSize, int recordCount, PagerMode mode) { StringBuilder url = new StringBuilder(); url.Append(HttpContext.Current.Request.Url.AbsolutePath + "?" + id.ToLower() + "={0}"); NameValueCollection collection = HttpContext.Current.Request.QueryString; string[] keys = collection.AllKeys; for (int i = 0; i < keys.Length; i++) { if (keys[i].ToLower() != id.ToLower()) url.AppendFormat("&{0}={1}", keys[i], collection[keys[i]]); } return GetNumericPage(currentPageIndex, pageSize, recordCount, url.ToString()); } /// <summary> /// 获取数字分页 /// </summary> /// <param name="currentPageIndex"></param> /// <param name="pageSize"></param> /// <param name="recordCount"></param> /// <param name="url"></param> /// <returns></returns> private static string GetNumericPage(int currentPageIndex, int pageSize, int recordCount, string url) { int pageCount = (recordCount % pageSize == 0 ? recordCount / pageSize : recordCount / pageSize + 1);//记录数据 产生的 页数 int len = 10;//len 表示 分页显示的页码长度 int left = (len - 1) / 2, right = len - left - 1; int start = currentPageIndex - left;//开始页数 int end = currentPageIndex + right;//结束页数 if (pageCount <= len) { start = 1; end = pageCount; } else if (start < 1) { start = 1; end = start + left + right; } else if (end > pageCount) { end = pageCount; start = pageCount - left - right; } StringBuilder sb = new StringBuilder(); // 上一页 if (currentPageIndex <= 1) { //sb.Append("<span class=\"enablednext\"><<</span> "); } else { string url1 = string.Format(url.ToString(), currentPageIndex - 1); sb.AppendFormat("<span class=\"prev\"><a href=\"{0}\"><<</a></span> ", url1); } sb.Append("<span class=\"tip\"> </span>"); //中间数字 for (int i = start; i <= end; i++) { if (i == currentPageIndex) sb.AppendFormat("<span class=\"current\" >{0}</span> ", i); else { string url1 = string.Format(url.ToString(), i); sb.AppendFormat("<span><a href=\"{0}\">{1}</a></span> ", url1, i); } sb.Append("<span class=\"tip\"> </span>"); } // 下一页 if (currentPageIndex >= pageCount) { //sb.Append("<span class=\"enablednext\">>></span>"); } else { string url1 = string.Format(url.ToString(), currentPageIndex + 1); sb.AppendFormat("<span class=\"next\"><a href=\"{0}\">>></a></span>", url1); } return sb.ToString(); } /// <summary> /// /// </summary> /// <param name="helper"></param> /// <param name="oModel">ViewData["pagerModel"]</param> /// <returns></returns> public static string AjaxPager(Object oModel) { PagerModel model = oModel as PagerModel; return AjaxPager(model.id, model.mode, model.currentPageIndex, model.pageSize, model.recordCount, model.className); } /// <summary> /// 分页 /// </summary> /// <param name="helper"></param> /// <param name="id">分页id</param> /// <param name="currentPageIndex">当前页</param> /// <param name="pageSize">分页尺寸</param> /// <param name="recordCount">记录总数</param> /// <param name="htmlAttributes">分页头标签属性</param> /// <param name="className">分页样式</param> /// <param name="mode">分页模式</param> /// <returns></returns> private static string AjaxPager(string id, PagerMode mode, int currentPageIndex, int pageSize, int recordCount, string className) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("<table id=\"{0}\" class=\"{1}\"><tr><td>", id, className); sb.Append(AjaxGetNumericPage(currentPageIndex, pageSize, recordCount)); sb.Append("</td><tr></table>"); //builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); return sb.ToString(); } /// <summary> /// 获取数字分页 /// </summary> /// <param name="currentPageIndex"></param> /// <param name="pageSize"></param> /// <param name="recordCount"></param> /// <param name="url"></param> /// <returns></returns> private static string AjaxGetNumericPage(int currentPageIndex, int pageSize, int recordCount) { int pageCount = (recordCount % pageSize == 0 ? recordCount / pageSize : recordCount / pageSize + 1);//记录数据 产生的 页数 int len = 10;//len 表示 分页显示的页码长度 int left = (len - 1) / 2, right = len - left - 1; int start = currentPageIndex - left;//开始页数 int end = currentPageIndex + right;//结束页数 if (pageCount <= len) { start = 1; end = pageCount; } else if (start < 1) { start = 1; end = start + left + right; } else if (end > pageCount) { end = pageCount; start = pageCount - left - right; } StringBuilder sb = new StringBuilder(); // 上一页 if (currentPageIndex <= 1) sb.Append("<span class=\"enablednext\"><<<</span> "); else { sb.AppendFormat("<span class=\"prev\"><a href=\"javascript:void(0);\" onclick=\"ajaxpager({0});\" ><上一页</a></span> ", currentPageIndex - 1); } //中间数字 for (int i = start; i <= end; i++) { if (i == currentPageIndex) sb.AppendFormat("<span class=\"current\" >{0}</span> ", i); else { sb.AppendFormat("<span><a href=\"javascript:void(0);\" onclick=\"ajaxpager({0});\">{0}</a></span> ", i); } } // 下一页 if (currentPageIndex >= pageCount) sb.Append("<span class=\"enablednext\">>>></span>"); else { sb.AppendFormat("<span class=\"next\"><a href=\"javascript:void(0);\" onclick=\"ajaxpager({0});\">下一页></a></span>", currentPageIndex + 1); } return sb.ToString(); } } /// <summary> /// 分页实体类 /// </summary> public class PagerModel { /// <summary> /// 容器ID,并QueryString的key值,默认值page。 /// </summary> public string id { get; set; } public PagerMode mode { get; set; } /// <summary> /// 默认值1。 /// </summary> public int currentPageIndex { get; private set; } /// <summary> /// 默认值10。 /// </summary> public int pageSize { get; set; } /// <summary> /// 默认值0。 /// </summary> public int recordCount { get; set; } /// <summary> /// 默认样式pager。 /// </summary> public string className { get; set; } public PagerModel(int pageSize, int recordCount) { id = "page"; this.pageSize = pageSize; this.recordCount = recordCount; className = "pager"; mode = PagerMode.Normal; currentPageIndex = Convert.ToInt32(HttpContext.Current.Request[id] ?? "1"); } /// <summary> /// 根据id自动设置当前页,使用默认id时不需要调用此方法。 /// </summary> /// <returns></returns> public PagerModel AutoSetCurrentPageIndex() { currentPageIndex = Convert.ToInt32(HttpContext.Current.Request[id] ?? "1"); return this; } } }