关于Ajax无刷新分页技术的一些研究 c#
2013-07-30 11:38
519 查看
小弟新手,求大神有更好的解决方案,指教下~
以前做项目,用过GridView的刷新分页,也用过EasyUI的封装好的分页技术,最近在老项目的基础上加新功能,迫于需求,自己没事琢磨了个Ajax无刷新分页技术,
也在百度看了下, 写的都不是很系统,在这里写个系统的,简单的,方便大家研究下。
系统支持 和数据库交互的无刷新分页、删除后的 当前页 定位、在查询条件下的 分页 ,有数据,显示删除,列表,没有只显示新增按钮。
项目采取的后台拼html,图了个简单,方便区分分页js,在后台写html,增加服务器压力,第一选择还是传JSON哈,谢谢楼下大神回答。
我写的这个无刷新分页用的最重要的sql 语句就是
sql = @"select * from (select ROW_NUMBER() over (ORDER BY CREATEDATE) rownum,a.goodsid,a.goodsname,a.itemname,a.price FROM GoodsOrderAccept a " + selectsql + ") t where t.rownum>='" + ((page - 1) * 10 + 1) + "' and t.rownum<='" + page * 10 + "'";
相信有些大神,看到这里,已经知道我采取的什么方法了,重点就是 ROW_NUMBER(),利用它和Page变量,从前台页面请求不同的页码,显示不同的数据。
下面看一下项目的目录结构:
![](http://images.cnitblog.com/blog/544941/201307/30111506-52ca6c16bb8f43c3be0f5959c90a0d58.png)
List.aspx就是页面,Page.ashx就是实现的分页技术,JSONObject.cs在后台对JSON序列化成对象。
List.aspx页面执行如下:
![](http://images.cnitblog.com/blog/544941/201307/30112033-965fbd02a734438684d606ebdc465768.png)
如页面所示,支持checkbox,单删除,多删除.
下面开始贴代码:
List.aspx页面代码如下:
开始插入 Page.ashx代码:
以前做项目,用过GridView的刷新分页,也用过EasyUI的封装好的分页技术,最近在老项目的基础上加新功能,迫于需求,自己没事琢磨了个Ajax无刷新分页技术,
也在百度看了下, 写的都不是很系统,在这里写个系统的,简单的,方便大家研究下。
系统支持 和数据库交互的无刷新分页、删除后的 当前页 定位、在查询条件下的 分页 ,有数据,显示删除,列表,没有只显示新增按钮。
项目采取的后台拼html,图了个简单,方便区分分页js,在后台写html,增加服务器压力,第一选择还是传JSON哈,谢谢楼下大神回答。
我写的这个无刷新分页用的最重要的sql 语句就是
sql = @"select * from (select ROW_NUMBER() over (ORDER BY CREATEDATE) rownum,a.goodsid,a.goodsname,a.itemname,a.price FROM GoodsOrderAccept a " + selectsql + ") t where t.rownum>='" + ((page - 1) * 10 + 1) + "' and t.rownum<='" + page * 10 + "'";
相信有些大神,看到这里,已经知道我采取的什么方法了,重点就是 ROW_NUMBER(),利用它和Page变量,从前台页面请求不同的页码,显示不同的数据。
下面看一下项目的目录结构:
![](http://images.cnitblog.com/blog/544941/201307/30111506-52ca6c16bb8f43c3be0f5959c90a0d58.png)
List.aspx就是页面,Page.ashx就是实现的分页技术,JSONObject.cs在后台对JSON序列化成对象。
List.aspx页面执行如下:
![](http://images.cnitblog.com/blog/544941/201307/30112033-965fbd02a734438684d606ebdc465768.png)
如页面所示,支持checkbox,单删除,多删除.
下面开始贴代码:
List.aspx页面代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="List.aspx.cs" Inherits="AjaxPage.List" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script> <title>分页功能演示</title> <script type="text/javascript"> $(function () { //初始化首页数据以及各种变量 $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "getFirstPageAndVariable" }, success: function (data) { if (data.outStr != "" && data.pagecount != "0") { //有数据加载数据列表,显示数据列表,显示删除按钮,以及分页按钮 document.getElementById('btn_delete').style.display = ""; document.getElementById('div_list').style.display = ""; document.getElementById('div_page').style.display = ""; $("#tbody_list").empty(); $("#tbody_list").append(data.outStr); //把总页数赋值给变量 $('#<%=hid_last.ClientID %>').val(data.pagecount); //初始化页数输入框 $("#text_page").val($('#<%=hid_shou.ClientID %>').val()); //将上一页和下一页变量赋值为首页变量 $('#<%=hid_change.ClientID %>').val($('#<%=hid_shou.ClientID %>').val()); } } }); //绑定按钮事件 $("#btn_search").bind("click", btn_search); $("#btn_delete").bind("click", btn_delete); //查询事件 function btn_search(event) { //查询输入框不为空的话,才执行查询事件 //if ($("#text_search").val().toString().replace(/[ ]/g, "") != "") { $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "getFirstPageAndVariable", search: $("#text_search").val() }, success: function (data) { if (data.outStr != "" && data.pagecount != "0") { //有数据加载数据列表,显示数据列表,显示删除按钮,以及分页按钮 document.getElementById('btn_delete').style.display = ""; document.getElementById('div_list').style.display = ""; document.getElementById('div_page').style.display = ""; $("#tbody_list").empty(); $("#tbody_list").append(data.outStr); //把总页数赋值给变量 $('#<%=hid_last.ClientID %>').val(data.pagecount); //初始化页数输入框 $("#text_page").val($('#<%=hid_shou.ClientID %>').val()); //模糊查询后,将上一页和下一页变量赋值为首页变量 $('#<%=hid_change.ClientID %>').val($('#<%=hid_shou.ClientID %>').val()); } } }); //} } //删除事件 function btn_delete(event) { var deleteData = ""; $("#tbody_list tr").each(function () { if ($($(this).children().get(0)).find("input")[0].status) { deleteData += $($(this).children().get(0)).find("input")[0].value + "," + $($(this).children().get(0)).find("input")[0].value + "|"; } }); if (deleteData == "") { alert("不能提交空数据!"); return false; } if (!confirm("确定要删除吗?")) { return false; } $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "deleteData", deleteData: deleteData }, success: function (data) { if (data.status == "success") { //初始化当前页数据以及各种变量 $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "getDeletePageAndVariable", hid_change: $('#<%=hid_change.ClientID %>').val(), search: $("#text_search").val() }, success: function (data) { if (data.pagecount != "0") { $("#tbody_list").empty(); $("#tbody_list").append(data.outStr); //把总页数赋值给变量 $('#<%=hid_last.ClientID %>').val(data.pagecount); //初始化页数输入框 $("#text_page").val(data.hid_change); //将上一页和下一页变量赋值为首页变量 $('#<%=hid_change.ClientID %>').val(data.hid_change); } } }); } } }); } //加载首页点击事件 $("#a_shou").click(function () { $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "clickPageAndGetData", page: $('#<%=hid_shou.ClientID %>').val(), search: $("#text_search").val() }, success: function (data) { if (data.outStr != "") { $("#tbody_list").empty(); $("#tbody_list").append(data.outStr); $("#text_page").val($('#<%=hid_shou.ClientID %>').val()); //将上一页和下一页的变量赋值为首页变量 $('#<%=hid_change.ClientID %>').val($('#<%=hid_shou.ClientID %>').val()); } } }); }); //加载末页点击事件 $("#a_last").click(function () { $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "clickPageAndGetData", page: $('#<%=hid_last.ClientID %>').val(), search: $("#text_search").val() }, success: function (data) { if (data.outStr != "") { $("#tbody_list").empty(); $("#tbody_list").append(data.outStr); $("#text_page").val($('#<%=hid_last.ClientID %>').val()); //将上一页和下一页的变量赋值为首页变量 $('#<%=hid_change.ClientID %>').val($('#<%=hid_last.ClientID %>').val()); } } }); }); //加载上一页点击事件 $("#a_back").click(function () { //当前页面为首页时,无上一页事件 var back = parseInt($('#<%=hid_change.ClientID %>').val()) - 1; if (back != 0) { $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "clickPageAndGetData", page: back, search: $("#text_search").val() }, success: function (data) { if (data.outStr != "") { $("#tbody_list").empty(); $("#tbody_list").append(data.outStr); $('#<%=hid_change.ClientID %>').val(back); $("#text_page").val(back); } } }); } }); //加载下一页点击事件 $("#a_next").click(function () { //当前页面为最后一页时,无下一页事件 var next = parseInt($('#<%=hid_change.ClientID %>').val()) + 1; if ($('#<%=hid_change.ClientID %>').val() != $('#<%=hid_last.ClientID %>').val()) { $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "clickPageAndGetData", page: next, search: $("#text_search").val() }, success: function (data) { if (data.outStr != "") { $("#tbody_list").empty(); $("#tbody_list").append(data.outStr); $('#<%=hid_change.ClientID %>').val(next); $("#text_page").val(next); } } }); } }); //加载确定点击事件 $("#a_ok").click(function () { $.ajax({ type: "POST", url: "Page.ashx", dataType: "json", data: { action: "clickPageAndGetData", page: $("#text_page").val(), search: $("#text_search").val() }, success: function (data) { if (data.outStr != "") { $("#tbody_list").empty(); $("#tbody_list").append(data.outStr); $('#<%=hid_change.ClientID %>').val($("#text_page").val()); } } }); }); }); var record = { num: "" } var checkDecimal = function (n) { var decimalReg = /^[0-9]*[1-9][0-9]*$/; if (n.value != "" && decimalReg.test(n.value)) { record.num = n.value; } else { if (n.value != "") { n.value = record.num; } } } </script> </head> <body> <form id="form_page" runat="server"> <!--页面顶部--> <div id="div_tool"> <table width="100%" id="table_tool"> <tr> <td width="50%" style="text-align: center"> 请输入食材名称: <input type="text" id="text_search" /> </td> <td width="25%"> <input type="button" value="查询" id="btn_search" /> </td> <td width="25%"> <input type="button" value="删除" style="display: none" id="btn_delete" /> </td> </tr> </table> </div> <br /> <!--页面主题部分--> <div id="div_list" style="display: none"> <table width="100%" id="table_list"> <thead> <tr> <th width="25%"> 选择 </th> <th width="25%"> 食材名称 </th> <th width="25%"> 食材单位 </th> <th width="25%"> 食材单价 </th> </tr> </thead> <tbody id="tbody_list"> </tbody> </table> </div> <!--始终保持在页面底部--> <div id="div_page" style="position: absolute; bottom: 0; display: none"> <table width="100%"> <tr> <td style="text-align: center; width: 100%"> <a href="#" id="a_shou">首页</a> <a href="#" id="a_back">上一页</a> <input type="text" id="text_page" style="width: 50px;" onkeyup="checkDecimal(this)" /> <a href="#" id="a_next">下一页</a> <a href="#" id="a_last">末页</a> <a href="#" id="a_ok"> 确定</a> </td> </tr> </table> </div> <!--记录点击首页的变量,始终为1--> <asp:HiddenField ID="hid_shou" runat="server" Value="1" /> <!--记录点击上一页和下一页的变量--> <asp:HiddenField ID="hid_change" runat="server" /> <!--记录点击末页的变量--> <asp:HiddenField ID="hid_last" runat="server" /> </form> </body> </html>
开始插入 Page.ashx代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; using System.Data; namespace AjaxPage { /// <summary> /// Page 的摘要说明,10条数据分页 /// </summary> public class Page : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; JSONObject jo = new JSONObject(); //取得页面发出的动作 string action = context.Request["action"]; //取得页面的查询条件 string search = context.Request["search"]; SqlDataAdapter ad = null; DataSet dsPagecount = new DataSet(); DataSet dsOutstr = new DataSet(); DataTable dt = new DataTable(); string sql = ""; string connectstring = "server=localhost;User ID=sa;Password=1;database=SqcpDB;Connection Reset=FALSE"; String outStr = String.Empty; string selectsql = ""; //页面有查询条件 if (search != "") { selectsql = " where goodsname like '%" + search + "%' "; } //初始化页面以及首页内容 if (action == "getFirstPageAndVariable") { sql = @"select count(goodsid) from GoodsOrderAccept" + selectsql; ad = new SqlDataAdapter(sql, connectstring); ad.Fill(dsPagecount); dt = dsPagecount.Tables[0]; //取得数据总条数 int count = Convert.ToInt32(dt.Rows[0][0]); //每页10条记录,取得总页数逻辑 int pagecount = count / 10; if (count % 10 != 0) { pagecount++; } jo.Add("pagecount", pagecount.ToString()); sql = @"select * from (select ROW_NUMBER() over (ORDER BY CREATEDATE) rownum,a.goodsid,a.goodsname,a.itemname,a.price FROM GoodsOrderAccept a " + selectsql + ") t where t.rownum>=0 and t.rownum<=10"; ad = new SqlDataAdapter(sql, connectstring); ad.Fill(dsOutstr); dt = dsOutstr.Tables[0];//初始加载首页10条数据 if (null != dt && dt.Rows.Count != 0) { foreach (DataRow dr in dt.Rows)//遍历dt以html的格式输出内容 { outStr += "<tr>"; //给checkbox设置value属性,方便删除 outStr += String.Format("<td style='text-align:center'><input type='checkbox' value='{0}' /></td>", dr["goodsid"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["goodsname"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["itemname"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["price"]); outStr += "</tr>"; } } jo.Add("outStr", outStr); context.Response.Write(JSONConvert.SerializeObject(jo)); } //点击分页按钮时,执行的动作 else if (action == "clickPageAndGetData") { string pagestr = context.Request["page"]; int page = Convert.ToInt32(pagestr); sql = @"select * from (select ROW_NUMBER() over (ORDER BY CREATEDATE) rownum,a.goodsid,a.goodsname,a.itemname,a.price FROM GoodsOrderAccept a " + selectsql + ") t where t.rownum>='" + ((page - 1) * 10 + 1) + "' and t.rownum<='" + page * 10 + "'"; ad = new SqlDataAdapter(sql, connectstring); ad.Fill(dsOutstr); dt = dsOutstr.Tables[0]; if (null != dt && dt.Rows.Count != 0) { foreach (DataRow dr in dt.Rows)//遍历dt以html的格式输出内容 { outStr += "<tr>"; //给checkbox设置value属性,方便删除 outStr += String.Format("<td style='text-align:center'><input type='checkbox' value='{0}' /></td>", dr["goodsid"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["goodsname"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["itemname"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["price"]); outStr += "</tr>"; } } jo.Add("outStr", outStr); context.Response.Write(JSONConvert.SerializeObject(jo)); } //点击删除按钮时,执行的动作 else if (action == "deleteData") { String[] postDatas = context.Request["deleteData"].Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); SqlConnection conn = new SqlConnection(connectstring); conn.Open(); foreach (String pd in postDatas) { String[] pdArr = pd.Split(",".ToCharArray()); sql = @"delete from GoodsOrderAccept where goodsid='" + pdArr[0] + "'"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); } conn.Close(); jo.Add("status", "success"); context.Response.Write(JSONConvert.SerializeObject(jo)); } //删除成功后,固定到当前页 else if (action == "getDeletePageAndVariable") { string hid_changestr = context.Request["hid_change"]; int hid_change = Convert.ToInt32(hid_changestr); sql = @"select count(goodsid) from GoodsOrderAccept" + selectsql; ad = new SqlDataAdapter(sql, connectstring); ad.Fill(dsPagecount); dt = dsPagecount.Tables[0]; int count = Convert.ToInt32(dt.Rows[0][0]); int pagecount = count / 10; if (count % 10 != 0) { pagecount++; } jo.Add("pagecount", pagecount.ToString());//每页10条记录,取得总页数 if (hid_change > pagecount) { hid_change = pagecount; } jo.Add("hid_change", hid_change.ToString()); sql = @"select * from (select ROW_NUMBER() over (ORDER BY CREATEDATE) rownum,a.goodsid,a.goodsname,a.itemname,a.price FROM GoodsOrderAccept a " + selectsql + ") t where t.rownum>='" + ((hid_change - 1) * 10 + 1) + "' and t.rownum<='" + hid_change * 10 + "'"; ad = new SqlDataAdapter(sql, connectstring); ad.Fill(dsOutstr); dt = dsOutstr.Tables[0]; if (null != dt && dt.Rows.Count != 0) { foreach (DataRow dr in dt.Rows)//遍历dt以html的格式输出内容 { outStr += "<tr>"; //给checkbox设置value属性,方便删除 outStr += String.Format("<td style='text-align:center'><input type='checkbox' value='{0}' /></td>", dr["goodsid"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["goodsname"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["itemname"]); outStr += String.Format("<td style='text-align:center'>{0}</td>", dr["price"]); outStr += "</tr>"; } } jo.Add("outStr", outStr); context.Response.Write(JSONConvert.SerializeObject(jo)); } } public bool IsReusable { get { return false; } } } }
相关文章推荐
- 关于Ajax无刷新分页技术的一些研究 c#
- 关于Ajax无刷新分页技术的一些研究 c#
- ASP.NET C#+Ajax+json无刷新分页参考
- 关于学好Ajax要掌握的一些技术
- C#2.0下用Ajax无刷新快速分页例子(一)
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- .net用ajax技术实现无刷新分页(初学)
- [原创]终极分页:Ajax+Js+Dom+Json无刷新分页技术叫板另一篇仿百度、Google分页算法
- C#2.0下用Ajax无刷新快速分页例子(二)
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- C# .NET AJAX无刷新技术
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- Ajax+Js+Dom+Json无刷新分页技术
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
- C#2.0下用Ajax无刷新快速分页例子
- Ajax+Js+Dom+Json无刷新分页技术
- Ajax+Js+Dom+Json无刷新分页技术
- Ajax+Js+Dom+Json无刷新分页技术