zoukankan      html  css  js  c++  java
  • 利用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#也对它作以迎合,我们何简而不为呢?

  • 相关阅读:
    如何在Power BI Desktop中呈现D3.js自定义图表
    在Power BI中动态嵌入网页
    Querying SQL Server Agent Job Information
    shell 切换当前路径到脚本所在路径
    洛谷 P1220 关路灯
    P7077 函数调用(CSP-S2020 T3)
    P7075 儒略日(2020CSP-S T1)
    2020CSP-S 复赛总结
    洛谷 P1886 滑动窗口 /【模板】单调队列
    洛谷P5656 【模板】二元一次不定方程(exgcd)
  • 原文地址:https://www.cnblogs.com/inline/p/2542173.html
Copyright © 2011-2022 走看看