前面两个章节我们将需求分析和概要设计简单介绍了,接下来是重点的编代码的阶段了(实现无刷新分页)。在编写代码之前,一定要有计划的去编写代码,不能一开始啥也不管就开始编代码,除非你特牛。
我们来看一下需求分析:
3.==》无刷新的分页读取新闻列表,在点击下一页的时候触发事件,调用ajax去数据库中查找下一页的数据并返回,然后显示在页面上。
这里面有两个事件,都是js事件,我们用jquery代码来实现。
分页的话,我们采用jquery的分页插件pagination,官方地址为http://plugins.jquery.com/project/pagination下载js文件和css文件(最下面附下载地址)
先讲讲它的基本用法:
跟一般的jQuery插件一样,此插件使用也很简单便捷。方法是pagination
,例如$("#page").pagination(100);
,这里的100参数是必须的,表示显示项目的总个数,这是最简单的使用。
例如下面的使用代码:
- $("#Pagination").pagination(56, {
- num_edge_entries: 2,
- num_display_entries: 4,
- callback: pageselectCallback,
- items_per_page:1
- });
这段代码表示的含义是:总共有56(maxentries)个列表项,首尾两侧分页显示2(num_edge_entries)个,连续分页主体数目显示4(num_display_entries)个,回调函数为pageselectCallback(callback),每页显示的列表项为 1(items_per_page)。您可以对照参数表修改配置这里的参数。
具体的用法可以参考官方文档或是http://www.cnblogs.com/aosiyelong/archive/2010/03/30/1700262.html
然后讲讲如何将它整合到我们这边来。
在NewsList.aspx页面中添加相关的js文件和css文件(最下面附下载地址):jquery-1.4.1.js,pagination.js
- <link type="text/css" rel="Stylesheet" href="css/newsList.css" />
- <link type="text/css" rel="Stylesheet" href="css/pagination.css" />
- <script src="js/jquery-1.4.1.js" type="text/javascript"></script>
- <script src="js/jquery.pagination.js" type="text/javascript"></script>
然后,我们来看关键的js代码:
- <script type="text/javascript" language="javascript">
- $().ready(function() {
- InitData(0);
- });
- //处理翻页
- function pageselectCallback(page_id, jq) {
- //alert(page_id);
- InitData(page_id);
- };
- function InitData(pageindx)
- {
- var tbody = "";
- var orderby="news_id";
- $.ajax({
- type: "POST",//用POST方式传输
- dataType:"json",//数据格式JSON
- url:'Ajax/NewsHandler.ashx',//目标地址
- data:"pageno="+(pageindx+1)+"&orderby="+orderby,
- success:function(json) {
- $("#productTable tr:gt(0)").remove();
- var productData = json.News;
- $.each(productData, function(i, n) {
- var trs = "";
- trs += "<tr><td style='text-align:center'><a href=\"NewsRead.aspx?news_id="+n.news_id+"\" class=\"info2\" >" + n.news_title + "</a></td><td style='text-align:center'>" + n.news_readtimes + "</td><td style='text-align:center'>" + n.news_time + "</td></tr>";
- tbody += trs;
- });
- $("#productTable").append(tbody);
- //奇偶行颜色不同
- $("#productTable tr:gt(0):odd").attr("class", "odd");
- $("#productTable tr:gt(0):even").attr("class", "enen");
- }
- });
- $("#pagination").pagination(<%=pagecount %>, {
- callback: pageselectCallback,
- prev_text: '<< 上一页,
- next_text: '下一页 >>',
- items_per_page:9,
- num_display_entries:6,
- current_page:pageindx,
- num_edge_entries:2
- });
- }
- </script>
- [
- {
- "term":"BACCHUS",
- "part":"n.",
- "definition":"A convenient deity invented by the ancients as an excuse for getting drunk.",
- "quote":[
- "Is public worship,then,a sin.",
- "That for devotions paid to Bacchus",
- "The lictors dare to run us in.",
- "And resolutely thump and whack us?"
- ],
- "author":"Jorace"
- },
- {
- "term":"BACKBITE",
- "part":"v.t.",
- "definition":"To speak of a man as you find him when he can t find you."
- },
- {
- "term":"BEARD",
- "part":"n.",
- "definition":"The hair that is commonly cut off by those who justly execrate the absurd Chinese custom of shaving the bead."
- }
- ]
- public static string DataTableToJSON(DataTable dt, string dtName)
- {
- StringBuilder sb = new StringBuilder();
- StringWriter sw = new StringWriter(sb);
- using (JsonWriter jw = new JsonTextWriter(sw))
- {
- JsonSerializer ser = new JsonSerializer();
- jw.WriteStartObject();
- jw.WritePropertyName(dtName);
- jw.WriteStartArray();
- foreach (DataRow dr in dt.Rows)
- {
- jw.WriteStartObject();
- foreach (DataColumn dc in dt.Columns)
- {
- jw.WritePropertyName(dc.ColumnName);
- ser.Serialize(jw, dr[dc].ToString());
- }
- jw.WriteEndObject();
- }
- jw.WriteEndArray();
- jw.WriteEndObject();
- sw.Close();
- jw.Close();
- }
- return sb.ToString();
- }
我们来看一下上面关键的js代码:,当然也可以用aspx文件作为ajax后台处理文件。
在项目中添加ajax文件夹用来存放ajax处理文件,并且添加Generic Handler类型的文件(或是一般的webform),取名为NewsHandler.ashx,这个文件是用来处理ajax请求的。
主要代码如下:
- int pageindex;//页数
- int.TryParse(context.Request["pageno"], out pageindex);//把赋值给pageindex
- string orderby = context.Request["orderby"].ToString();//以什么排序
- DataTable dt = new DataTable();
- dt = PageData(pageindex, 10, "tb_news", orderby);//获取数据
- string jsonData = DataTableToJSON(dt, "News");//创建json对象,将datatable对象转换为json对象
- context.Response.Write(jsonData);//返回json数据
- #region 返回特定页数的数据
- /// <summary>
- /// 返回特定页数的数据
- /// </summary>
- /// <param name="pageindex">特定的页数</param>
- /// <param name="pagesize">页的大小</param>
- /// <param name="table">哪张表</param>
- /// <returns></returns>
- public DataTable PageData(int pageindex, int pagesize, string table, string orderby)
- {
- string connectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["NewsConnection"].ToString();
- OleDbConnection conn;
- if (pageindex < 1)
- pageindex = 1;
- conn = new OleDbConnection(connectionString);
- DataTable dt=new DataTable();
- try
- {
- conn.Open();
- OleDbCommand cmdTotal = new OleDbCommand("select count(0) from " + table, conn);
- int recordCount = Convert.ToInt32(cmdTotal.ExecuteScalar());//数据的总数
- int pageCount;//总共的页数
- if (recordCount % pagesize > 0)
- pageCount = recordCount / pagesize + 1;
- else
- pageCount = recordCount / pagesize;
- if (pageindex > pageCount)
- pageindex = pageCount;
- DataTable dataTemp = new DataTable();
- string cmdText = "select news_id,news_title,news_readtimes,news_time from " + table + " order by " + orderby + " desc";
- OleDbCommand cmd = new OleDbCommand(cmdText, conn);
- OleDbDataAdapter oda = new OleDbDataAdapter(cmd);
- oda.Fill(dataTemp);
- dt= dataTemp.Clone();
- for (int i = 0; i < pagesize; i++)
- {
- if (recordCount <= (pagesize * (pageindex - 1) + i))
- break;
- dt.Rows.Add(dataTemp.Rows[pagesize * (pageindex - 1) + i].ItemArray);
- }
- }
- catch (Exception e)
- {
- }
- finally
- {
- conn.Close();
- }
- return dt;
- }
- #endregion
- protected void InitPageCount()
- {
- conn = new OleDbConnection(connectionString);//创建新的连接
- try
- {
- conn.Open();
- string cmdText = "select count(0) as pages from tb_news";
- OleDbCommand cmd = new OleDbCommand(cmdText, conn);
- DataTable dt = new DataTable();
- OleDbDataAdapter oda = new OleDbDataAdapter(cmd);
- oda.Fill(dt);
- if (dt != null)
- {
- pagecount = dt.Rows[0]["pages"].ToString();
- }
- }
- catch (Exception e)
- {
- pagecount = "0";
- Response.Write("Error:" + e.Message);//如果连接失败,将错误显示出来
- }
- finally
- {
- conn.Close();//一定要及时关掉conn
- }
- }
需-需声明protected string pagecount;以便让前台能够获取
附件:http://down.51cto.com/data/2358191
本文转自xshf12345 51CTO博客,原文链接:http://blog.51cto.com/alexis/573678,如需转载请自行联系原作者