利用ajax完成無刷新分頁的功能


 

利用ajax完成無刷新分頁的功能 aspx+ashx  動軟三層 分頁存儲過程

首先寫出分頁最好用一下存儲過程

--存儲過程
create proc usp_GetPagedPhotos
 @pageIndex int,
 @pageSize int,
 @pageCount int output
as
 declare @n int
 select @n=COUNT(*) from Photos
 set @pageCount = CEILING(@n*1.0/@pageSize)
--ceiling 天花板 把浮點型以小數點分割左邊整數加一取整 2.1→3 @n*1.0轉換成浮點型除以一個整數就可以是一個浮點型數了
 select * from 
 (select *,ROW_NUMBER() over(order by ptime desc) as num from Photos) as t
 where num between (@pageIndex-1)*@pageSize + 1 and @pageIndex*@pageSize
 order by PTime desc

 

--這樣就可以通過輸入第幾頁,一頁有多少條數據可以得出要顯示的數據以及返回一共有多少頁

DAL層(調用動軟代碼生成器的dbsqlhelper執行存儲過程)

      

  public DataSet GetPagedData(int pageIndex, int pageSize, out int pageCount)
        {
            SqlParameter[] param = { 
                                   new SqlParameter("@pageIndex",SqlDbType.Int),
                                    new SqlParameter("@pageSize",SqlDbType.Int),
                                     new SqlParameter("@pageCount",SqlDbType.Int)
                                   };
            //設置輸入參數
            param[0].Value = pageIndex;
            param[1].Value = pageSize;

            //設置輸出參數
            param[2].Direction = ParameterDirection.Output;


            DataSet ds = Maticsoft.DBUtility.DbHelperSQL.RunProcedure("usp_GetPagedPhotos", param, "photos");

            //執行完存儲過程,獲取輸出參數的值
            pageCount = Convert.ToInt32(param[2].Value);

            return ds;
        }

  

BLL 層( 轉成泛型集合,調用動軟生成的 datatable to list方法)

    public List<Photos> GetPagedData(int pageIndex, int pageSize, out int pageCount)
        {
            DataSet ds = dal.GetPagedData(pageIndex, pageSize, out pageCount);

            return DataTableToList(ds.Tables[0]);
        }

  

個人比較喜歡先寫ashx頁面 ,想:ajax用json數據比較好 而且c#里有專門處理list to json的一個良好的機制方法 Serialize (內部原理就是object to string,序列化)

       

  PhotosBLL bll = new PhotosBLL();
        //准備傳過來的參數
        int index=int.Parse(context.Request.QueryString["index"]);
        int pagesize=int.Parse(context.Request.QueryString["page"]);
        //准備輸出的總頁數
        int count;

        List<Photos> list = bll.GetPagedData(index, pagesize, out count);
     
        JavaScriptSerializer jss = new JavaScriptSerializer();
        //將泛型集合轉換成json對象
        string json = jss.Serialize(list);
        //[{"key":value,"key":value},{"key":value,"key":value}]
        //此時的json對象里沒有總頁數,所以要把總頁數拼接到json對象中進行傳遞,拼接的時候要注意json對象的格式
        json = json.Replace("]",",{\"count\":"+count+"}]");
        //[{"key":value,"key":value},{"key":value,"key":value},{"count":4}]
        context.Response.Write(json);

  

  
現在開始寫jquery ajax

html結構

<div id="left">
            <img src="../images/1.gif" /></div>
            <div id="right">
            <div id="p">
            
            </div>
            <br />
            <div id="page">
                <ul>
                 <li><a href="#" id="firstpage">首頁</a></li>
                <li><a href="#" id="beforepage">上一頁</a></li>
                <li><a href="#" id="nextpage">下一頁</a></li>
                <li id="pagelist"><a href="#">1</a><a href="#">2</a><a href="#">3</a></li>
                <li>當前頁: <span id="pages"></span> </li>
                 <li><a href="#" id="lastpage">尾頁</a></li>
                </ul>
            </div>
            </div>
            <div class="coverholder">
        <input type="text" />
        <input type="button" id="btn1" value="cancel" />
    </div>
 

 

 
重量級人物來了jquery ajax

第一次加載頁面,寫成方法,傳入index(第幾頁) page(一頁幾條數據)
   

  function loadps(index, page) {
  
  //$.getJSON ,$.get ,$.post 是對$.ajax 的一個封裝 這里傳過來的是json數據源 用$.getJSON 最好
             $.getJSON("GetPagedAjax.ashx?" + Math.random(), { "index": index, "page": page }, function (json) {

                //獲取頁數,為全局變量賦值
                pagesize = json[json.length - 1].count;

                //動態生成表格
                var $tb = $("<table id='tbPhotos'></table>");
                $("#p").append($tb);

                var $th = $("<tr><th>序號</th><th>標題</th><th>圖片</th><th>點擊次數</th><th>支持</th><th>反對</th><th>時間</th><th>操作</th></tr>");
                $tb.append($th);
                 
     //過濾掉最后一個非數據源  json.length - 1
                for (var i = 0; i < json.length - 1; i++) {
                    var $tr = $("<tr></tr>");
                    $tb.append($tr);
                    //第一個td
                    var $td = $("<td>" + (i + 1) + "</td>");
                    $tr.append($td);

                    //
                    $td = $("<td><a href='04-PhotoDetails.aspx?pid=" + json[i].PId + "'>" + json[i].PTitle + "</a></td>");
                    $tr.append($td);

                    //
                    $td = $("<td><img src='../images/" + json[i].PUrl + "' width='150px'/></td>");
                    $tr.append($td);

                    //
                    $td = $("<td>" + json[i].PClicks + "</td>");
                    $tr.append($td);

                    $td = $("<td><a pid='" + json[i].PId + "' href='#'><img src='gif/85.gif' /><span>" + json[i].PUp + "</span></a></td>");
                    $tr.append($td);

                    $td = $("<td><a pid='" + json[i].PId + "' href='#'><img src='gif/86.gif' /><span>" + json[i].PDown + "</span></a></td>");
                    $tr.append($td);

                   //注意此時的時間轉換,這里我寫了一個方法(ChangeDateFormat(time))在外面,下面會寫出來
                    $td = $("<td>" + ChangeDateFormat(json[i].PTime) + "</td>");
                    $tr.append($td);

                    //
                    $td = $("<td>編輯  刪除</td>");
                    $tr.append($td);

                    //顯示當前頁面
                    $("#pages").text(index + "/" + pagesize);
                }
               
            });
      }

 

補充方法(小問題,小麻煩)ChangeDateFormat(time)
  
 

//轉換正確的時間格式
function ChangeDateFormat(cellval) {
    var date = new Date(parseInt(cellval.replace("/Date(", "").replace(")/", ""), 10));
    var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
    var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
    return date.getFullYear() + "-" + month + "-" + currentDate;
}

 

動態生成表格的拼接過程很無聊……
  
在頁面加載的時候加載該方法

總的代碼結構如下:

 <script type="text/javascript">  
    //定義三個全局變量 index page pagesize, 並賦初值,注意:盡量少使用全局變量,全局變量的作用域在整個JS文件里。
 //特別是在引用其它外部JS的時候,如果外部JS里有申明了這個變量了,就會出現沖突。本次為了方便理解才使用的。jquery里一般是使用匿名方法所以就沒有考慮。
 //定義全局變量是為了點擊下一頁的時候可以記錄當前的index  
 //index 第幾頁, page 每頁幾條 pagesize 一共有幾頁。
           var index = 1;
           var page = 4;

            //首次加載頁面
           loadps();
           //頁面總數 ,首次加載的時候就為 pagesize 賦值了
           var pagesize = 0;
     
   function loadps(){……}

     $(function (){……});  //寫上一頁,下一頁等點擊事件
  
</script>

 

 

現在寫相關事件
  

$(function () {
               //首頁
               $('#firstpage').click(function () {
                   if (index != 1) {
                       index = 1;
                       loadps();
                   }
                   return false;
               });
               //尾頁
               $('#lastpage').click(function () {
                   if (index != pagesize) {
                       index = pagesize;
                       loadps();
                   }
                   return false;
               });
               //上一頁
               $("#beforepage").click(function () {
                   if (index != 1) {
                       index = index - 1;
                       loadps();
                   }
                   return false;
               });

               //下一頁
               $("#nextpage").click(function () {
                   if (index < pagesize) {
                       index = index + 1;
                       loadps();
                   }
                   return false;
               });

           })

 

 

總結:感覺上面原來ajax就這點東西,不過就是拿數據,拼接表格,顯示。重點就只有 $.getJSON 方法的使用、處理JSON數據和用jquery拼接表格  不過小細節也應該注意。
 jquery 里的ajax方法,它把js里的創建xmlhttprequest對象的過程大大的簡化了。
最重要的最簡單的是利用json數據,json簡化對字符串的處理,它是以對象的方式進行傳遞的,而C#也對它作以迎合,我們何簡而不為呢?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM