无刷新分页

无刷新分页要用到自己定义的存储过程:

alter proc usp_DivMemberByPage
@pageIndex int,
@pageSize int,
@total int output //注意:这里不要忘记output
as
begin
    select * from
    (
        select *,row_number() over(order by uId asc) RowId from Member
    ) Temp where Temp.RowId between (@pageIndex-1)*@pageSize+1 and (@pageIndex)*@pageSize
    select @total=count(1) from Member
end
测试自己的存储过程
declare @total int
exec usp_DivMemberByPage 1,10,@total output //注意:这里也要加output
select @total

然后在动软的三层架构里加扩展
1.在DAL层复制Member.cs 改名为MemberExt,去掉构造方法和其他方法

    /// <summary>
    /// 数据访问类:Member
    /// </summary>
    public partial class Member
    {
        #region  ExtensionMethod

        /// <summary>
        /// 自定义存储过程:获取分页会员信息
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="total"></param>
        /// <returns></returns>
        public DataTable GetMemberPageByProc(int pageIndex, int pageSize, out int total)
        {
            String connStr = DbHelperSQL.connectionString;

            SqlParameter p1 = new SqlParameter("@pageIndex", SqlDbType.Int) { Value=pageIndex};
            SqlParameter p2 = new SqlParameter("@pageSize", SqlDbType.Int) { Value=pageSize};
            SqlParameter p3 = new SqlParameter("@total", SqlDbType.Int); //注意:这里的参数名必须和存储过程中形参名字一样
            p3.Direction = ParameterDirection.Output; //注意:这里要设置第三个参数的输出方向

            DataSet dSet = new DataSet();

            using (SqlDataAdapter sda = new SqlDataAdapter("usp_DivMemberByPage", connStr)) //注意:这里不能写成usp_DivMemberByPage @pageIndex, @pageSize, @total output的,只要写存储过程名字就行了
            {
                sda.SelectCommand.CommandType = CommandType.StoredProcedure;
                sda.SelectCommand.Parameters.Add(p1);
                sda.SelectCommand.Parameters.Add(p2);
                sda.SelectCommand.Parameters.Add(p3);

                sda.Fill(dSet);
            }

            total = Convert.ToInt32(p3.Value); //注意:必须给total赋值 p3.Value是Object类型,需要转换
            return dSet.Tables[0];
        }

        #endregion  ExtensionMethod

1.在BLL层复制Member.cs 改名为MemberExt,去掉构造方法和其他方法

  
  #region  ExtensionMethod
    /// <summary>
        /// 自定义存储过程:获取分页会员信息
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="total"></param>
        /// <returns></returns>
        public List<Model.Member> GetMemberPageByProc(int pageIndex, int pageSize, out int total)
        {
            return DataTableToList(dal.GetMemberPageByProc(pageIndex, pageSize,out total));
        }

        #endregion  ExtensionMethod

然后在web中的处理无刷新分页的一般处理程序应该这么写:

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";

            int pageIndex = context.Request["pageIndex"] == null ? 1 : int.Parse(context.Request["pageIndex"]);
            int pageSize = context.Request["pageSize"] == null ? 10 : int.Parse(context.Request["pageSize"]);

            BLL.Member memberMain = new BLL.Member();

            int total = 0;
            List<Model.Member> list = memberMain.GetMemberPageByProc(pageIndex, pageSize, out total);

            String _divString = Comm.LaoHePager.ShowPager(pageSize, pageIndex, total, "MemberManage/LoadAllMemberToJson.ashx");

            JavaScriptSerializer js = new JavaScriptSerializer();
            String temp = js.Serialize(new { JsonContent=list, divString=_divString}); //注意:这里是匿名类

            context.Response.Write(temp);
        }

生成分页字符串的LaoHePager类是这么写的:

public class LaoHePager
    {
        public static String ShowPager(int pageSize, int currentPage, int totalCount, String redirectTo)
        {
            //取出页容量
            pageSize = pageSize == 0 ? 3 : pageSize;

            //取出总页数
            int totalPage = Math.Max((totalCount + pageSize - 1) / pageSize, 1);

            StringBuilder sb = new StringBuilder();

            //判断当前索引是否有效
            if (currentPage < 1 || currentPage > totalPage)
            {
                return String.Empty;
            }

            //只有当前索引(currentIndex > 1)显示首页、上一页
            if (currentPage > 1)
            {
                sb.AppendFormat("<li><a class=‘head page‘ href=‘{0}?pageIndex={1}&pageSize={2}‘ >{3}</a></li> \n",
                    redirectTo, 1, pageSize, "首页");

                sb.AppendFormat("<li><a class=‘prev page‘ href=‘{0}?pageIndex={1}&pageSize={2}‘ >{3}</a></li> \n",
                    redirectTo, currentPage-1, pageSize, "上一页");
            }

            //显示当前页前后各5页的索引
            int distince = 5;
            for (int i = 0; i < 10; i++)
            {
                int index = currentPage - distince + i;
                if (index >= 1 && index <= totalPage)
                {
                    if (currentPage != index)
                    {
                        sb.AppendFormat("<li><a class=‘page‘ href=‘{0}?pageIndex={1}&pageSize={2}‘ >{3}</a></li> \n",
                            redirectTo, index, pageSize, index);
                    }
                    else
                    {
                        sb.AppendFormat("<li><a id=‘currPage‘ href=‘{0}?pageIndex={1}&pageSize={2}‘ >{3}</a></li> \n",
                            redirectTo, index, pageSize, index);
                    }
                }
            }

            //只有当前索引(currentIndex < 总页数)显示尾页、下一页
            if (currentPage < totalPage)
            {
                sb.AppendFormat("<li><a class=‘next page‘ href=‘{0}?pageIndex={1}&pageSize={2}‘ >{3}</a></li> \n",
                    redirectTo, currentPage + 1, pageSize, "下一页");

                sb.AppendFormat("<li><a class=‘tail page‘ href=‘{0}?pageIndex={1}&pageSize={2}‘ >{3}</a></li> \n",
                    redirectTo, totalPage, pageSize, "尾页");
            }

            sb.AppendFormat("<span class=‘summary‘>第{0}页 / 共{1}页</span>\n", currentPage, totalPage);

            return sb.ToString();
        }
    }

然后,在前端写一个函数,注意,必须自定义一个函数,因为无刷新分页为导航按钮绑定事件,需要调用自身

function LoadMemerToJson(pageIndex, pageSize) {
            $.ajax({
                url: ‘MemberManage/LoadAllMemberToJson.ashx‘,
                data: { ‘pageIndex‘: pageIndex, ‘pageSize‘: pageSize },
                type: ‘POST‘,
                dataType: ‘json‘,
                success: function (data) {
                    //加载会员列表
                    LoadMemberByJson(data.JsonContent);
                    //加载分页字符串
                    LoadDivString(data.divString);

                    //加载分页导航<a>链接后立即绑定点击事件
                    $(‘#divString li a‘).click(function () {
                        var currPageIndex = GetQueryStringValue($(this).attr(‘href‘), ‘pageIndex‘); //这里是通过函数解析QueryStrng,稍后说
                        var currPageSize = GetQueryStringValue($(this).attr(‘href‘), ‘pageSize‘);

                        LoadMemerToJson(currPageIndex, currPageSize); //这里就用到了加载自身
                        return false;
                    });

                },
                error: function (xhr, textStatus, errorThown) {
                    alert(‘服务器响应失败,错误信息:‘ + textStatus);
                }
            });
        }

这是解析QueryString的Javascript函数,QueryString就是url中键值对啦:比如 http://www.baidu.com?pageIndex=1&pageSize=10 中的

"?pageIndex=1&pageSize=10"就是QueryString

//传入键,得到值function GetQueryStringValue(QueryString, key) {

            var value = "";

            var sURL = QueryString;

            ///URL中是否包含查询字符串

            if (sURL.indexOf("?") > 0) {

                //分解URL,第二的元素为完整的查询字符串

                //即arrayParams[1]的值为【id=1&action=2】

                var arrayParams = sURL.split("?");

                //分解查询字符串

                //arrayURLParams[0]的值为【id=1 】

                //arrayURLParams[2]的值为【action=add】

                var arrayURLParams = arrayParams[1].split("&");

                //遍历分解后的键值对

                for (var i = 0; i < arrayURLParams.length; i++) {

                    //分解一个键值对

                    var sParam = arrayURLParams[i].split("=");

                    if ((sParam[0] == key) && (sParam[1] != "")) {

                        //找到匹配的的键,且值不为空

                        value = sParam[1];

                        break;

                    }

                }

            }

            return value;

        }
时间: 2024-07-30 13:40:51

无刷新分页的相关文章

Ajax实现无刷新分页

注:本文中使用到的一些类库在前面文章都能找到源代码,我会在文中指明链接所在,为了缩短文章篇幅,由此带来的阅读不便,敬请谅解. 本文讲解 Ajax 实现无刷新分页.实现原理.代码展示.代码下载. 这里需要说明一些知识: 1.Ajax 无刷新页面的好处:提供良好的客户体验,通过 Ajax 在后台从数据库中取得数据并展示,取缔了等待加载页面而出现的空白状态: 2.那么,Ajax 无刷新页面是运行在动态页面(.PHP)?还是静态页面(.html/.htm/.shtml)?答案是:静态页面: 3.实现原理

asp.net练习②——Paginaton无刷新分页

aspx代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>无刷新分页</title> <link href="c

无刷新分页 jquery.pagination.js

1.使用插件为 jquery.pagination.js ,如果没有这个js文件的话,我可以给发个. 首先引用 jquery.pagination.js (分页js),跟pagination.css(分页样式css). 点击获取查看这两个文件 2.页面js代码为 <script type="text/javascript"> var pageIndex = 0; //页面索引初始值 var pageSize = 15; //每页显示条数初始化,修改显示条数,修改这里即可 $

phpcms无刷新分页

控制器添加一个函数: 添加一个静态页面ajax_message.html,在页面中添加如下代码: 在要分页的页面(我的是"show"页面)中添加如上图代码: phpcms无刷新分页 2016-05-30 17:17:30 标签:ajaxphpcms分页it教育 控制器添加一个函数 添加一个静态页面ajax_message.html,在页面中添加如下代码:

Ajax 实现无刷新分页

Ajax 实现无刷新分页

smarty+php+ajax 简单无刷新分页

简介 分页,无非就是从数据库中获得我们想查询的数据,再加以处理即可! ① 确定数据总数($count) ② 每页显示数据条数($pageSize) ③ 分多少页($pageCount) ④ 上一页($pagePrev) ⑤ 下一页($pageNext) ⑥ 判断越界问题 ⑦ 偏移量($offset) ⑧ sql语句($sql = "select * from goods limit $offset,$pageSize";) 简单归简单,我们还得考虑实际的应用.例如:如果你正在土豆网看&

无刷新分页代码,jQuery分页完整示例

<!DOCTYPE html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>jQuery分页演示效果</title><script type="text/javascript" src="/ajaxjs/jquery1.3.2.js">&l

MVC简单分页(未实现无刷新分页)

分页Html辅助方法 using System.Text; using System.Web: using System.Web.Mvc; namespace System.Web.Mvc { public static class HtmlExtensions { #region 分页Html辅助方法 /// <summary> /// 分页Html辅助方法 /// </summary> /// <param name="htmlHelper">&

关于 异步无刷新分页的问题

今天做了  异步无刷新分页 ,之前自己的想法是 异步加载每一页的内容,传入pageSize(页面多大显示条数)和pageIndex(页码),然后查询出数据,放在dataset中,在利用json常用类库,把dataset转化为json对象,传回页面,同是把写好的分页代码也传回页面,当实施的时候遇到了困难,c#一般处理程序无法同时传两个参数到页面. 后来发现了一种方法, System.Web.Script.Serialization.JavaScriptSerializer,序列化,引用了--命名空