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

  • 相关阅读:
    MTK相关汇总
    Android TV 学习笔记
    进程限制_limit
    Linux TV 学习笔记
    Linux firmware子系统的实现机制学习笔记
    C++ STL deque
    C++ STL Vector
    C++ STL几种数据结构对比
    vector系列--creating vector of local structure、vector of structs initialization
    vector系列--vector<unique_ptr<>>赋值给vector<unique_ptr<>>
  • 原文地址:https://www.cnblogs.com/MarchThree/p/3751053.html
Copyright © 2020-2023  润新知