一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载

 更新时间:2021年9月22日 10:18  点击:1830

之前自己一直用Aspnetpager控件来显示项目中的分页,但是每次都要拖一个aspnetpager的控件进去,感觉很不舒服,因为现在自己写的webform都不用服务器控件了,所以自己仿照aspnetpager写了一个精简实用的返回分页显示的html方法,其他话不说了,直接上代码。
分页显示信息的实体类:

复制代码 代码如下:

public class Pager
    {
        private string _firstPageText;
        /// <summary>
        /// 最前一页文字显示 默认显示为"首页"
        /// </summary>
        public string FirstPageText
        {
            get {
                return string.IsNullOrEmpty(_firstPageText)? "首页" : _firstPageText;
            }
            set {
                _firstPageText = value;
            }
        }
        private string _prePageText;
        /// <summary>
        /// 上一页文字显示 默认显示为"上一页"
        /// </summary>
        public string PrePageText
        {
            get
            {
                return string.IsNullOrEmpty(_prePageText) ? "上一页" : _prePageText;
            }
            set
            {
                _prePageText = value;
            }
        }
        private string _nextPageText;
        /// <summary>
        /// 下一页文字显示 默认显示为"下一页"
        /// </summary>
        public string NextPageText
        {
            get
            {
                return string.IsNullOrEmpty(_nextPageText) ? "下一页" : _nextPageText;
            }
            set
            {
                _nextPageText = value;
            }
        }
        private string _lastPageText;
        /// <summary>
        /// 末页文字显示 默认显示为"末页"
        /// </summary>
        public string LastPageText
        {
            get
            {
                return string.IsNullOrEmpty(_lastPageText) ? "末页" : _lastPageText;
            }
            set
            {
                _lastPageText = value;
            }
        }
        /// <summary>
        /// 总记录数
        /// </summary>
        public int RecordCount { get; set; }
        private int _pagesize=15;
        /// <summary>
        /// 每页分页尺寸 默认为15
        /// </summary>
        public int PageSize {
            get {
                return _pagesize == 0 ? 15 : _pagesize;
            }set{
                _pagesize = value;
            }
        }
        private int _pageIndex=1;
        /// <summary>
        /// 当前页码
        /// </summary>
        public int PageIndex {
            get {
                return _pageIndex == 0 ? 1 : _pageIndex;
            }
            set {
                _pageIndex = value;
            }
        }
        private int _maxShowPageSize = 10;
        /// <summary>
        /// 显示页码列表的最大个数 默认为10
        /// </summary>
        public int MaxShowPageSize {
            get {
                return _maxShowPageSize;
            }
            set {
                _maxShowPageSize = value;
            }
        }
        private string _queryStringName;
        /// <summary>
        /// 页码在浏览器中传值的名称  默认为page
        /// </summary>
        public string QueryStringName {
            get {
                return string.IsNullOrEmpty(_queryStringName)? "page" : _queryStringName;
            }
            set {
                _queryStringName = value;
            }
        }
        /// <summary>
        /// 页面的URL
        /// </summary>
        public string URL {
            get {
                string url = HttpContext.Current.Request.Url.AbsoluteUri;//当前页面绝对路径
                if (EnableUrlRewriting)//使用url重写
                {
                    url=url.Substring(0, url.LastIndexOf("/") + 1);//获取当前页面的目录路径
                    url += UrlRewritePattern;
                }
                else {//普通带问号的页面传值
                    //demo.aspx
                    //demo.aspx?a=1
                    //demo.aspx?page=1
                    //demo.aspx?a=2&page=1
                    if (url.Contains("aspx?"))
                    {
                        if (Regex.IsMatch(url,@"page=[0-9]*$",RegexOptions.IgnoreCase))//如果存在page=*的字符串
                        {
                            url = Regex.Replace(url, @"page=[0-9]*$", "", RegexOptions.IgnoreCase);//替换掉page=*的字符串
                        }
                        url += QueryStringName + "={0}";
                    }
                    else {
                        url += "?" + QueryStringName + "={0}";
                    }
                }
                return url;
            }
        }
        private bool _enableUrlRewriting;
        /// <summary>
        /// URL是否重写 默认为flase
        /// </summary>
        public bool EnableUrlRewriting {
            get {
                return (object)_enableUrlRewriting == null ? false : _enableUrlRewriting;
            }
            set {
                _enableUrlRewriting = value;
            }
        }
        /// <summary>
        /// 页面URL重写规则,将页码传值用{0}来代替  比如list-1-{0}.html,启用该功能需要将EnableUrlRewriting属性设为true
        /// </summary>
        public string UrlRewritePattern { get; set; }
        private string _className;
        /// <summary>
        /// 分页容器的css名称
        /// </summary>
        public string ClassName {
            get {
                return string.IsNullOrEmpty(_className) ? "paginator" : _className;
            }set{
                _className = value;
            }
        }
        private string _currentPageCss;
        /// <summary>
        /// 当前页面按钮css
        /// </summary>
        public string CurrentPageButtonCss {
            get {
                return string.IsNullOrEmpty(_currentPageCss) ? "cpb" : _currentPageCss;
            }set{
                _currentPageCss = value;
            }
        }
        private bool _showSpanText;
        /// <summary>
        /// Span 标签中文字信息是否显示 默认为false不显示
        /// </summary>
        public bool ShowSpanText {
            get {
                return (object)_showSpanText == null ? false : _showSpanText;
            }
            set {
                _showSpanText = value;
            }
        }
        private string _spanTextClass;
        /// <summary>
        /// 分页文字描述span标签css
        /// </summary>
        public string SpanTextClass {
            get {
                return string.IsNullOrEmpty(_spanTextClass) ? "stc" : _spanTextClass;
            }
            set {
                _spanTextClass = value;
            }
        }
        private string _submitButtonText;
        /// <summary>
        /// 确定按钮文字显示 默认显示"确定"
        /// </summary>
        public string SubmitButtonText {
            get {
                return string.IsNullOrEmpty(_submitButtonText) ? "确定" : _submitButtonText;
            }
            set {
                _submitButtonText = value;
            }
        }
    }

分页显示html代码的拼接方法:
复制代码 代码如下:

public class SplitManager
    {
                public static string AspNetPagers(Pager pager)
        {
            StringBuilder sb = new StringBuilder();
            string attr="";
            int pagecount = 0;//当前页面的总层数
            int floorcount = 0;//分页的总层数
            int currentLastPage = 0;//当前最后一页的页码
            int pageNum = pager.RecordCount / pager.PageSize + 1;//总页数 1~24
            sb.AppendFormat("<div class=\"{0}\">\n", pager.ClassName);
            attr=pager.PageIndex==1?"disabled=disabled":"";//标志当前页第一页是否相等 来控制前俩个按钮的有效性
            sb.AppendFormat(GetAHtml(attr,string.Format(pager.URL,1),pager.FirstPageText));//添加最前一页的代码
            sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pager.PageIndex-1), pager.PrePageText));//添加上一页的代码
            pagecount = pager.PageIndex/pager.MaxShowPageSize;//当前页数 0~1~2
            pagecount = pager.PageIndex % pager.MaxShowPageSize == 0 ? pagecount - 1 : pagecount;//清除当 当前页数为分页页码数的整数倍页时除数多一的状况
            floorcount = pageNum / pager.MaxShowPageSize;//页面层数 0~1~2
            currentLastPage=pageNum<pager.MaxShowPageSize * (pagecount + 1)?pageNum:pager.MaxShowPageSize * (pagecount + 1);
            if (pager.PageIndex > pager.MaxShowPageSize)//当当前序号大于每页页码个数时显示再前端...
            {
                sb.AppendFormat(GetAHtml("", string.Format(pager.URL, pager.MaxShowPageSize * pagecount), "..."));
            }
            for (int i = pager.MaxShowPageSize * pagecount + 1; i <= currentLastPage; i++)
            {
                if (i == pager.PageIndex)//判断循环页面是否为当前页
                {
                    sb.AppendFormat(GetSpanHtml(i, pager.CurrentPageButtonCss));
                }
                else {
                    sb.AppendFormat(GetAHtml("", string.Format(pager.URL, i),i.ToString()));
                }
            }
            if (pager.PageIndex <= pager.MaxShowPageSize * floorcount)//当当前序号小于倒数第二页页码时显示在后端...
            {
                sb.AppendFormat(GetAHtml("", string.Format(pager.URL, pager.MaxShowPageSize * (pagecount + 1) + 1), "..."));
            }
            attr = pager.PageIndex == pageNum ? "disabled=disabled" : "";//标志当前页最后一页是否相等 来控制后俩个按钮的有效性
            sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pager.PageIndex+1), pager.NextPageText));//添加后一页的代码
            sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pageNum), pager.LastPageText));//添加最后一页的代码
            if (pager.ShowSpanText)//是否显示分页文字span标签显示
            {
                sb.AppendFormat("<span class=\"" + pager.SpanTextClass + "\">共{0}页,每页{1}条记录 \n", pageNum, pager.PageSize);
                sb.AppendFormat("到第<input type=\"input\" id=\"jumpNum\" style=\"width:20px;\" name=\"jump\" value=\"{0}\" />页", pager.PageIndex == pageNum ? pageNum : pager.PageIndex + 1);
                sb.AppendFormat("<a href=\"#\" style=\"float:none;\" onclick=\"javascript:jump();\">" + pager.SubmitButtonText + "</a></span>\n");
                sb.Append(GetJumpScript(pager.URL));//添加按钮跳转的javascript代码
            }
            sb.AppendFormat("</div>");//
            return sb.ToString();
        }
        /// <summary>
        /// get the html of a label
        /// </summary>
        /// <param name="title">a's title</param>
        /// <param name="url">the url of a</param>
        /// <param name="attr">the attribute</param>
        /// <returns>return html string</returns>
        private static string GetAHtml(string attr,string url,string title)
        {
            return "<a " + attr + " href=\""+url+"\" style=\"margin-right:5px;\">"+title+"</a>\n";
        }
        /// <summary>
        /// get the html of a label
        /// </summary>
        /// <param name="num">the content of span</param>
        /// <param name="className">Class style Name</param>
        /// <returns>return html string </returns>
        private static string GetSpanHtml(int num, string className)
        {
            return "<span class=\"" + className + "\">" + num + "</span>\n";
        }
        /// <summary>
        /// 获取跳转的javascript代码
        /// </summary>
        /// <param name="url">当前分页的url规则</param>
        /// <returns>返回一个javascript代码</returns>
        private static string GetJumpScript(string url)
        {
            string scriptstr = "<script type=\"text/javascript\">\n" +
                        "function jump(){\n" +
                            "var jnum=document.getElementById(\"jumpNum\").value;\n" +
                            "if(isNaN(jnum)){\n"+
                                "alert(\"在跳转框中请输入数字!\");\n" +
                                "}\n"+
                            "else{\n"+
                                //"alert(jnum);\n" +
                                "location.href=String.format(\"" + url + "\",jnum);\n" +
                            "}\n"+
                        "}\n"+
                        "String.format = function() {\n"+
                            "if( arguments.length == 0 )\n"+
                                "return null; \n"+
                            "var str = arguments[0]; \n"+
                            "for(var i=1;i<arguments.length;i++) {\n"+
                                "var re = new RegExp('\\\\{' + (i-1) + '\\\\}','gm');\n"+
                                "str = str.replace(re, arguments[i]);\n"+
                            "}\n"+
                            "return str;\n"+
                        "}\n"+
                "</script>\n";
            return scriptstr;
        }
    }

最精简必要的几个参数传进去就能显示分页效果了:
复制代码 代码如下:

protected string str = "";
        protected void Page_Load(object sender, EventArgs e)
        {
            Pager pager = new Pager() { RecordCount = 350,
                PageSize = 15,
                MaxShowPageSize=10,
                PageIndex = Convert.ToInt32(Request.QueryString["page"]),
            ShowSpanText=true};
            str = SplitManager.AspNetPagers(pager);
        }

仿csdn的分页的效果图

供测试的css:
复制代码 代码如下:

View Code
<style type="text/css">
        /*分页样式控制的开始*/
.paginator { font: 12px Arial, Helvetica, sans-serif;
             padding:10px 20px 10px 0;
             margin: 0px;}
.paginator a {border:solid 1px #ccc;
              color:#0063dc;
              cursor:pointer;
              text-decoration:none;}
.paginator a:visited {padding: 1px 6px;
                      border: solid 1px #ddd;
                      background: #f0f1f1;
                      text-decoration: none;}
.paginator .cpb {border:1px solid #14316b;
                 font-weight:700;
                 color:#f0f1f1;
                 background-color:#1f3d76;}
.paginator a:hover {border:solid 1px #14316b;
                    color:#14316b;
                    text-decoration:none;}
.paginator a,.paginator a:visited,.paginator .cpb,.paginator a:hover{float:left;
                                                                     height:16px;
                                                                     line-height:16px;
                                                                     min-width:10px;_width:10px;
                                                                     margin-right:5px;
                                                                     text-align:center;
                                                                     white-space:nowrap;
                                                                     font-size:12px;
                                                                     font-family:
                                                                     Arial,SimSun;
                                                                     padding:0 3px;}
.paginator .stc{color:#999;margin-left:20px;}
.paginator .stc a{margin-left:10px;}
/*分页样式控制的结束*/
    </style>

同时配合为了配合分页,再给出一个DataTable转泛型列表的一个方法和一个分页存储过程。
此转换方法需配合相应的实体类,并且实体类中需对象相应表的字段名,不区分大小写。
复制代码 代码如下:

 #region DataTable To List/Model
        /// <summary>
        /// DataTable To List
        /// </summary>
        /// <typeparam name="TType">object type</typeparam>
        /// <param name="dt">DataTable</param>
        /// <returns>return a List Model type</returns>
        public static List<T> DataTableToObjectList<T>(DataTable dt) where T : new()
        {
            DataRowCollection drc = dt.Rows;
            int columncount = drc.Count;
            List<T> result = new List<T>();    //declare the generic type of return
            Type type = typeof(T);
            PropertyInfo[] propertys = type.GetProperties(BindingFlags.IgnoreCase|BindingFlags.Instance|BindingFlags.Public|BindingFlags.SetProperty);   //get the collections of the model
            foreach (DataRow r in drc)
            {
                result.Add(DataRowToObjectModel<T>(r, propertys));
            }    
            return result;
        }
        /// <summary>
        /// DataRow To a Model
        /// </summary>
        /// <typeparam name="T">the type of Model</typeparam>
        /// <param name="r">DataRow</param>
        /// <param name="propertys">the object to Model</param>
        /// <returns>return a Model Type</returns>
        private static T DataRowToObjectModel<T>(DataRow r, PropertyInfo[] propertys) where T : new()
        {
            T t = new T();
            for (int i = 0; i < propertys.Length; i++)
            {
                object obj = r[propertys[i].Name];
                if (obj != null)
                {
                    if (propertys[i].PropertyType == typeof(int))
                        propertys[i].SetValue(t, PublicMethod.GetInt(obj), null);
                    if (propertys[i].PropertyType == typeof(string))
                        propertys[i].SetValue(t, obj.ToString(), null);
                    if (propertys[i].PropertyType == typeof(DateTime))
                        propertys[i].SetValue(t, PublicMethod.GetDateTime(obj), null);
                }
            }
            return t;
        }
        #endregion

分页存储过程。
复制代码 代码如下:

CREATE PROCEDURE [dbo].[proc_SplitPage]
    -- Add the parameters for the stored procedure here
    @tblName   varchar(255),       -- 表名
    @strFields varchar(1000) = '*', -- 需要返回的列,默认*
    @strOrder varchar(255)='',      -- 排序的字段名,必填
    @strOrderType varchar(10)='ASC', -- 排序的方式,默认ASC
    @PageSize   int = 10,          -- 页尺寸,默认10
    @PageIndex int = 1,           -- 页码,默认1
    @strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL   varchar(5000)
if @strWhere !=''
set @strWhere=' where '+@strWhere
set @strSQL=
'SELECT '+@strFields+' FROM ('+
    'SELECT ROW_NUMBER() OVER (ORDER BY '+@strOrder+' '+@strOrderType+') AS pos,'+@strFields+' '+
    'FROM '+@tblName+' '+@strWhere+
') AS sp
WHERE pos BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND '+str(@PageIndex*@PageSize)
exec (@strSQL)

以上是全部代码,由于本人还是新手,请大家查找问题并指导,谢谢。
有些朋友需要源码的再此下载,方便测试

[!--infotagslink--]

相关文章

  • ASP.NET购物车实现过程详解

    这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 在ASP.NET 2.0中操作数据之七十二:调试存储过程

    在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
  • ASP.NET Core根据环境变量支持多个 appsettings.json配置文件

    这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 记一次EFCore类型转换错误及解决方案

    这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
  • 详解ASP.NET Core 中基于工厂的中间件激活的实现方法

    这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • asp.net通过消息队列处理高并发请求(以抢小米手机为例)

    这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • ASP.NET单选按钮控件RadioButton常用属性和方法介绍

    RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22
  • ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表

    在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19
  • ASP.NET中iframe框架点击左边页面链接 右边显示链接页面内容

    这篇文章主要介绍了ASP.NET中iframe框架点击左边页面链接,右边显示链接页面内容的实现代码,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 创建一个完整的ASP.NET Web API项目

    ASP.NET Web API具有与ASP.NET MVC类似的编程方式,ASP.NET Web API不仅仅具有一个完全独立的消息处理管道,而且这个管道比为ASP.NET MVC设计的管道更为复杂,功能也更为强大。下面创建一个简单的Web API项目,需要的朋友可以参考下...2021-09-22
  • ASP.NET连接MySql数据库的2个方法及示例

    这篇文章主要介绍了ASP.NET连接MySql数据库的2个方法及示例,使用的是MySQL官方组件和ODBC.NET,需要的朋友可以参考下...2021-09-22
  • Asp.Net使用Bulk实现批量插入数据

    这篇文章主要介绍了Asp.Net使用Bulk实现批量插入数据的方法,对于进行asp.net数据库程序设计非常有借鉴价值,需要的朋友可以参考下...2021-09-22
  • Asp.net中获取DataTable选择第一行某一列值

    这篇文章主要介绍了获取DataTable选择第一行某一列值,需要的朋友可以参考下...2021-09-22
  • ASP.Net中的async+await异步编程的实现

    这篇文章主要介绍了ASP.Net中的async+await异步编程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • Asp.net动态生成html页面的方法分享

    这篇文章介绍了Asp.net动态生成html页面的方法,有需要的朋友可以参考一下...2021-09-22
  • 详解ASP.NET Core Token认证

    这篇文章主要介绍了详解ASP.NET Core Token认证,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2021-09-22
  • .NET Core如何获取操作系统中的各种信息

    .net core是最近讨论频率很高的话题,下面这篇文章主要给大家介绍了关于利用.NET Core如何获取操作系统中各种信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧...2021-09-22
  • ASP.NET百度Ueditor编辑器实现上传图片添加水印效果

    这篇文章主要给大家介绍了ASP.NET百度Ueditor编辑器1.4.3这个版本实现上传图片添加水印效果的相关资料,文中通过图文及示例代码介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。...2021-09-22
  • asp.net反射简单应用实例

    这篇文章主要介绍了asp.net反射简单应用,结合完整实例形式分析了asp.net反射的原理与简单使用方法,需要的朋友可以参考下...2021-09-22
  • ASP.NET MVC API 接口验证的示例代码

    本篇文章主要介绍了ASP.NET MVC API 接口验证的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22