>  기사  >  백엔드 개발  >  ASP.NET MVC5는 페이징 쿼리를 구현합니다.

ASP.NET MVC5는 페이징 쿼리를 구현합니다.

高洛峰
高洛峰원래의
2017-02-27 16:36:582080검색

페이징은 대용량 데이터를 쿼리하고 표시하는 데 적합합니다. 이 글에서는 페이징 쿼리 구현 아이디어를 간략하게 소개합니다.

페이징에는 총 데이터 양, 각 페이지에 표시되는 데이터 항목 수, 현재 페이지 번호라는 세 가지 변수가 필요합니다.

//数据总量
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 폴더의 파일을 사이트에 수동으로 복사해야 합니다.

@*
  amount:数据总数,count:每页显示的数据条数,redierctUrl点击按钮时的跳转链接
  页面上需引用:bootstrap.min.css
*@
@helper CreatePaginateButton(int amount, int count, string redirectUrl)
{
  <p 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>
  </p>
  <script>
    $(function () {
      //设置被选中按钮的背景色
      var selected = $(&#39;#@selectedIndex&#39;);
      if (selected != undefined) {
        selected.css(&#39;background-color&#39;, &#39;#E1E1E1&#39;);
      }
  </script>
}

첫 페이지에서 호출하여 페이징 버튼을 그립니다

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

다음은 여러 페이징 버튼 렌더링입니다.

ASP.NET MVC5 实现分页查询
ASP.NET MVC5 实现分页查询
ASP.NET MVC5 实现分页查询

해당 HTML 코드:

ASP.NET MVC5 实现分页查询

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되길 바랍니다.

페이징 쿼리를 구현하는 ASP.NET MVC5와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.