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


相关推荐: 深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  微信公众帐号开发教程之图文消息全攻略  EditPlus中的正则表达式 实战(1)  Laravel如何实现一对一模型关联?(Eloquent示例)  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel怎么实现验证码(Captcha)功能  如何快速搭建虚拟主机网站?新手必看指南  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel如何使用查询构建器?(Query Builder高级用法)  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在香港免费服务器上快速搭建网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何在七牛云存储上搭建网站并设置自定义域名?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  使用spring连接及操作mongodb3.0实例  香港服务器部署网站为何提示未备案?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何快速查询网址的建站时间与历史轨迹?  Laravel如何实现事件和监听器?(Event & Listener实战)  利用vue写todolist单页应用  如何在建站宝盒中设置产品搜索功能?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  昵图网官方站入口 昵图网素材图库官网入口  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  QQ浏览器网页版登录入口 个人中心在线进入  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  清除minerd进程的简单方法  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  html如何与html链接_实现多个HTML页面互相链接【互相】  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  详解jQuery中的事件  网站制作软件有哪些,制图软件有哪些?  如何基于云服务器快速搭建网站及云盘系统?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  如何确保FTP站点访问权限与数据传输安全?  微信小程序 闭包写法详细介绍  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  jQuery 常见小例汇总  如何在阿里云虚拟服务器快速搭建网站?  如何登录建站主机?访问步骤全解析  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践