ASP.NET MVC5 实现分页查询

简介: 对于大量数据的查询和展示使用分页是一种不错的选择,这篇文章简要介绍下自己实现分页查询的思路。 分页需要三个变量:数据总量、每页显示的数据条数、当前页码。 //数据总量 int dataCount; //每页显示的数据条数 int pageDataCount; int pageNumber; 根据数据总量和每页显示的数据条数计算出总页数,根据当前页码和每页显示的数据条数计算出从数据库中读取数据的起始行号和结束行号。

对于大量数据的查询和展示使用分页是一种不错的选择,这篇文章简要介绍下自己实现分页查询的思路。

分页需要三个变量:数据总量、每页显示的数据条数、当前页码。

//数据总量
int dataCount;
//每页显示的数据条数
int pageDataCount;
int pageNumber;

根据数据总量和每页显示的数据条数计算出总页数,根据当前页码和每页显示的数据条数计算出从数据库中读取数据的起始行号和结束行号。

//总页数
int pageCount = (int)Math.Ceiling(dataCount/ (pageDataCount* 1.0));
int startLine = (pageNumber - 1) * PageDataCount + 1;
int endLine=startLine + PageDataCount - 1;

对于数据库的查询操作使用轻量级ORM框架Dapper来实现,具体代码如下:

protected IDbConnection CreateConnection()
{
    IDbConnection dbConnection = new SqlConnection(ConnectionString);
    dbConnection.Open();
    return dbConnection;
}

//获取数据库中数据的总条数
public virtual int QueryDataCount(string tableName)
{
    using (IDbConnection dbConnection = CreateConnection())
    {
        var queryResult = dbConnection.Query<int>("select count(Id) from " + tableName);
        if (queryResult == null || !queryResult.Any())
        {
            return 0;
        }
        return queryResult.First();
    }
}

public virtual IEnumerable<T> RangeQuery<T>(string tableName, int startline, int endline)
{
    if (string.IsNullOrEmpty(tableName))
    {
        throw new ArgumentNullException("表名不得为空或null");
    }
    if (startline <= 0)
    {
        throw new ArgumentOutOfRangeException("起始行号必须大于0");
    }
    if (endline - startline < 0)
    {
        throw new ArgumentOutOfRangeException("结束行号不得小于起始行号");
    }
    using (IDbConnection dbConnection = CreateConnection())
    {
        var queryResult = dbConnection.Query<T>("select  top " + (endline - startline + 1) + " * from " + tableName + " where Id not in (select top " + (startline - 1) + " Id from " + tableName + " order by Id desc) order by Id desc");
        if (queryResult != null && queryResult.Any())
        {
            return queryResult;
        }
    }
    return null;
}
View Code

 


绘制分页按钮

在App_Code文件夹中添加PageHelper.cshtml文件封装绘制按钮的代码,这里需要注意一点,使用VS发布站点时App_Code文件夹中的文件不会被打包,需要手动拷贝App_Code文件夹中的文件到站点中。

@*
    amount:数据总数,count:每页显示的数据条数,redierctUrl点击按钮时的跳转链接
    页面上需引用:bootstrap.min.css
*@
@helper CreatePaginateButton(int amount, int count, string redirectUrl)
{
    <div id="pagenumber" style="position:fixed;bottom:-15px;text-align:center;width:84%">
        <nav style="text-align:center">
            <ul class="pagination">
                <li><a href="@redirectUrl/1">首页</a></li>
                @{
                    int pageNumber = (int)Math.Ceiling(amount / (count * 1.0));
                    pageNumber = pageNumber < 1 ? 1 : pageNumber;
                    //页面上显示的按钮数目(不计首页、末页、上一页、下一页等按钮),若页面总数超过该值则绘制按钮分隔符
                    const int BUTTON_COUNT = 7;
                    // 按钮分隔符
                    const string BUTTON_SEPARATOR = "......";
                    //按钮分隔符左侧按钮数目(不计首页、末页、上一页、下一页等按钮)
                    const int LEFT_BUTTON_COUNT = 4;
                    //按钮分隔符右侧按钮数目(不计首页、末页、上一页、下一页等按钮)
                    const int RIGHT_BUTTON_COUNT = 2;

                    string[] urlSegments = Request.Url.Segments;
                    int selectedIndex = 0;
                    int.TryParse(urlSegments[urlSegments.Length - 1], out selectedIndex);
                    int previous = (selectedIndex - 1) <= 0 ? 1 : selectedIndex - 1;
                    int next = (selectedIndex + 1 > pageNumber) ? pageNumber : selectedIndex + 1;
                    var r=Request.Cookies[""];
                    if (pageNumber > BUTTON_COUNT)
                    {
                <li><a id="next" href="@redirectUrl/@previous">上一页</a></li>
                        for (int i = 1; i <= BUTTON_COUNT; i++)
                        {
                            if ( selectedIndex >= LEFT_BUTTON_COUNT && selectedIndex%LEFT_BUTTON_COUNT==0 && i <= LEFT_BUTTON_COUNT)
                            {
                <li><a name="pageButton" id="@selectedIndex" href="@redirectUrl/@selectedIndex">@selectedIndex</a></li>
                                int step = selectedIndex;
                                int tag = 0;
                                for (i = 1; i <= LEFT_BUTTON_COUNT; i++)
                                {
                                    tag = i + step;
                                    if (tag > pageNumber - RIGHT_BUTTON_COUNT)
                                    {
                                        if (i <= LEFT_BUTTON_COUNT)
                                        {
                                            i = LEFT_BUTTON_COUNT + 1;
                                        }
                                        break;
                                    }
                <li><a name="pageButton" id="@tag" href="@redirectUrl/@tag">@tag</a></li>
                                }
                            }
                            else if (i <= LEFT_BUTTON_COUNT && selectedIndex<LEFT_BUTTON_COUNT)
                            {
                <li><a name="pageButton" id="@i" href="@redirectUrl/@i">@i</a></li>
                            }
                            else if (i < LEFT_BUTTON_COUNT && selectedIndex>LEFT_BUTTON_COUNT)
                            {
                                int step = selectedIndex / LEFT_BUTTON_COUNT;
                                int tag = 0;
                <li><a name="pageButton" id="@(step*LEFT_BUTTON_COUNT)" href="@redirectUrl/@(step*LEFT_BUTTON_COUNT)">@(step*LEFT_BUTTON_COUNT)</a></li>
                                for (i = 1; i <= LEFT_BUTTON_COUNT; i++)
                                {
                                    tag = i + step * LEFT_BUTTON_COUNT;
                                    if (tag > pageNumber - RIGHT_BUTTON_COUNT)
                                    {
                                        if (i <= LEFT_BUTTON_COUNT)
                                        {
                                            i = LEFT_BUTTON_COUNT + 1;
                                        }
                                        break;
                                    }
                <li><a name="pageButton" id="@tag" href="@redirectUrl/@tag">@tag</a></li>
                                }
                            }
                            //绘制按钮分隔符右侧按钮
                            if (i==BUTTON_COUNT-1)
                            {
                <li><a name="pageButton" id="@(pageNumber-1)" href="@redirectUrl/@(pageNumber-1)">@(pageNumber-1)</a></li>
                            }
                            else if(i==BUTTON_COUNT)
                            {
                <li><a name="pageButton" id="@pageNumber" href="@redirectUrl/@pageNumber">@pageNumber</a></li>
                            }
                            //绘制按钮分隔符
                            else if (i >= BUTTON_COUNT -RIGHT_BUTTON_COUNT)
                            {
                <li><span name="pageButton">@BUTTON_SEPARATOR</span></li>
                            }
                        }
                <li><a id="next" href="@redirectUrl/@next">下一页</a></li>
                    }
                    else
                    {
                        for (int i = 1; i <= pageNumber; i++)
                        {
                <li><a name="pageButton" id="@i" href="@redirectUrl/@i">@i</a></li>
                        }
                    }
                }
                <li><a href="@redirectUrl/@pageNumber">末页</a></li>
            </ul>
        </nav>
    </div>
    <script>
        $(function () {
            //设置被选中按钮的背景色
            var selected = $('#@selectedIndex');
            if (selected != undefined) {
                selected.css('background-color', '#E1E1E1');
            }
    </script>
}
View Code

在前台页面中调用即可绘制分页按钮

@PageHelper.CreatePaginateButton(246, 10, "/usermanager/attentionlist/")

下面是几张分页按钮效果图:

 
 

对应的HTML代码:


 

以上是自己对于实现分页的思路,绘制分页按钮的方法过长,不是一个好的方案,若各位读者有更好的解决方案还望告知。文章最后推荐一个简单易用的分页组件X.PagedList

 

版权声明

本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接

如有问题, 请发送邮件和作者联系。

目录
相关文章
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
44 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
65 0
|
5月前
|
开发框架 JSON 前端开发
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
49 0
|
4月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
4月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
135 0
|
7月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
81 0
|
7月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
|
7月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
195 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
170 0