ASP.NET MVC5 实现分页查询的示例代码

发布时间 - 2026-01-10 23:11:33    点击率:

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

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

//数据总量
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;
}

绘制分页按钮

在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" rel="external nofollow" >首页</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" rel="external nofollow" >上一页</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" rel="external nofollow" >@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" rel="external nofollow" rel="external nofollow" >@tag</a></li>
                }
              }
              else if (i <= LEFT_BUTTON_COUNT && selectedIndex<LEFT_BUTTON_COUNT)
              {
        <li><a name="pageButton" id="@i" href="@redirectUrl/@i" rel="external nofollow" rel="external nofollow" >@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)" rel="external nofollow" >@(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" rel="external nofollow" rel="external nofollow" >@tag</a></li>
                }
              }
              //绘制按钮分隔符右侧按钮
              if (i==BUTTON_COUNT-1)
              {
        <li><a name="pageButton" id="@(pageNumber-1)" href="@redirectUrl/@(pageNumber-1)" rel="external nofollow" >@(pageNumber-1)</a></li>
              }
              else if(i==BUTTON_COUNT)
              {
        <li><a name="pageButton" id="@pageNumber" href="@redirectUrl/@pageNumber" rel="external nofollow" rel="external nofollow" >@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" rel="external nofollow" >下一页</a></li>
          }
          else
          {
            for (int i = 1; i <= pageNumber; i++)
            {
        <li><a name="pageButton" id="@i" href="@redirectUrl/@i" rel="external nofollow" rel="external nofollow" >@i</a></li>
            }
          }
        }
        <li><a href="@redirectUrl/@pageNumber" rel="external nofollow" rel="external nofollow" >末页</a></li>
      </ul>
    </nav>
  </div>
  <script>
    $(function () {
      //设置被选中按钮的背景色
      var selected = $('#@selectedIndex');
      if (selected != undefined) {
        selected.css('background-color', '#E1E1E1');
      }
  </script>
}

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

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

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



对应的HTML代码:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# asp.net  # mvc5  # 分页  # mvc实现分页  # ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedList.Mvc  # MVC+jQuery.Ajax异步实现增删改查和分页  # MVC分页之MvcPager使用详解  # ASP.NET MVC分页的实现方法  # ASP.NET MVC分页和排序功能实现  # ASP.NET MVC4 HtmlHelper扩展类  # 实现分页功能  # Asp.net MVC 中利用jquery datatables 实现数据分页显示功能  # ASP.NET MVC4 Razor模板简易分页效果  # ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意  # MVC使用MvcPager实现分页效果  # 行号  # 每页  # 条数  # 下一页  # 上一页  # 分隔符  # 首页  # 末页  # 夹中  # 数据库中  # 计算出  # 是一种  # 跳转  # 这篇文章  # 几张  # 来实现  # 需要注意  # 大家多多  # 为空 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Laravel如何使用Service Container和依赖注入?(代码示例)  Python数据仓库与ETL构建实战_Airflow调度流程详解  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  无锡营销型网站制作公司,无锡网选车牌流程?  历史网站制作软件,华为如何找回被删除的网站?  Laravel怎么实现模型属性的自动加密  如何用虚拟主机快速搭建网站?详细步骤解析  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何用PHP快速搭建高效网站?分步指南  如何快速搭建安全的FTP站点?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel集合Collection怎么用_Laravel集合常用函数详解  Laravel如何自定义分页视图?(Pagination示例)  Java类加载基本过程详细介绍  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel如何配置和使用缓存?(Redis代码示例)  如何在香港免费服务器上快速搭建网站?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  开心动漫网站制作软件下载,十分开心动画为何停播?  网站建设整体流程解析,建站其实很容易!  如何做网站制作流程,*游戏网站怎么搭建?  Laravel如何配置Horizon来管理队列?(安装和使用)  图册素材网站设计制作软件,图册的导出方式有几种?  JS去除重复并统计数量的实现方法  如何在IIS中新建站点并解决端口绑定冲突?  Laravel如何处理表单验证?(Requests代码示例)  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  浅谈redis在项目中的应用  PythonWeb开发入门教程_Flask快速构建Web应用  简历没回改:利用AI润色让你的文字更专业  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  IOS倒计时设置UIButton标题title的抖动问题  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  网站制作软件有哪些,制图软件有哪些?  如何在自有机房高效搭建专业网站?  如何快速生成橙子建站落地页链接?  如何在局域网内绑定自建网站域名?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel怎么为数据库表字段添加索引以优化查询  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  利用vue写todolist单页应用  浅述节点的创建及常见功能的实现