ASP.NET MVC5 實現分頁查詢

來源:互聯網
上載者:User
對於大量資料的查詢和展示使用分頁是一種不錯的選擇,這篇文章簡要介紹下自己實現分頁查詢的思路。

分頁需要三個變數:資料總量、每頁顯示的資料條數、當前頁碼。

//資料總量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){  <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 = $('#@selectedIndex');      if (selected != undefined) {        selected.css('background-color', '#E1E1E1');      }  </script>}

在前台頁面中調用即可繪製分頁按鈕

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

下面是幾張分頁按鈕:



對應的HTML代碼:


以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援topic.alibabacloud.com。

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.