C#_Ajax_分页

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 })

原文地址:https://www.cnblogs.com/MarchThree/p/3751053.html