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>&nbsp;");
            }
            else
            {
                string url1 = string.Format(url.ToString(), currentPageIndex - 1);
                sb.AppendFormat("<span class=\"prev\"><a href=\"{0}\"><<</a></span>&nbsp;", url1);
            }
            sb.Append("<span class=\"tip\">&nbsp;&nbsp;&nbsp;</span>");
            //中间数字

            for (int i = start; i <= end; i++)
            {
                if (i == currentPageIndex)
                    sb.AppendFormat("<span class=\"current\" >{0}</span>&nbsp;", i);
                else
                {
                    string url1 = string.Format(url.ToString(), i);
                    sb.AppendFormat("<span><a href=\"{0}\">{1}</a></span>&nbsp;", url1, i);
                }
                sb.Append("<span class=\"tip\">&nbsp;&nbsp;&nbsp;</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>&nbsp;");
            else
            {
                sb.AppendFormat("<span class=\"prev\"><a href=\"javascript:void(0);\" onclick=\"ajaxpager({0});\" ><上一页</a></span>&nbsp;", currentPageIndex - 1);
            }
            //中间数字
            for (int i = start; i <= end; i++)
            {
                if (i == currentPageIndex)
                    sb.AppendFormat("<span class=\"current\" >{0}</span>&nbsp;", i);
                else
                {
                    sb.AppendFormat("<span><a href=\"javascript:void(0);\" onclick=\"ajaxpager({0});\">{0}</a></span>&nbsp;", 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;
        }
    }
}