利用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#也对它作以迎合,我们何简而不为呢?

 

posted @ 2012-06-08 18:49  inline  阅读(7536)  评论(0编辑  收藏  举报