Asp.Net分页方法:JQuery插件实现Ajax无刷新分页、AspNetPager分页控件实现分页
一、使用JQuery插件pagination实现AJax无刷新分页:
以下只列出主要代码及注释,详细请参考最后源码:
我们需要用到的文件有:jquery.js,jquery.pagination.js,pagination.css
以及用于将DataTable转换为Json的插件Newtonsoft.Json.Net20.dll,文件在包含在最下面的源文件中
分页存储过程:
SET ANSI_NULLS ON
|
GO |
SET QUOTED_IDENTIFIER ON
|
GO |
-- ============================================= |
-- Author: 余泳彬 |
-- Create date: 2011-01-15 12:59 |
-- Description: 分页,用到了ROW_NUMBER() |
-- ============================================= |
create PROCEDURE [dbo].[proc_FenYe]
|
@tblName varchar(255), -- 表名
|
@strFields varchar(1000) = \'*\', -- 需要返回的列,默认*
|
@strOrder varchar(255)=\'\', -- 排序的字段名,必填
|
@strOrderType varchar(10)=\'ASC\', -- 排序的方式,默认ASC
|
@PageSize int = 10, -- 页尺寸,默认10
|
@PageIndex int = 1, -- 页码,默认1
|
@strWhere varchar(1500) = \'\' -- 查询条件 (注意: 不要加 where)
|
AS |
|
declare @strSQL varchar(5000)
|
|
if @strWhere !=\'\'
|
set @strWhere=\' where \'+@strWhere
|
|
set @strSQL=
|
\'SELECT * FROM (\'+
|
\'SELECT ROW_NUMBER() OVER (ORDER BY \'+@strOrder+\' \'+@strOrderType+\') AS pos,\'+@strFields+\' \'+
|
\'FROM \'+@tblName+\' \'+@strWhere+
|
\') AS sp WHERE pos BETWEEN \'+str((@PageIndex-1)*@PageSize+1)+\' AND \'+str(@PageIndex*@PageSize)
|
|
exec (@strSQL)
|
数据访问层主要函数:取出分页数据及计算总条数(主要看传的什么参数即可)
/// <summary>分页获取数据列表(所有字段+类名)</summary> |
/// <param name="order">排序字段</param> |
/// <param name="ordertype">排序类型:desc或asc</param> |
/// <param name="PageSize">页大小</param> |
/// <param name="PageIndex">页索引</param> |
/// <param name="strWhere">条件</param> |
/// <returns></returns> |
public DataSet GetList(string order, string ordertype, int PageSize, int PageIndex, string strWhere)
|
{ |
Database db = DatabaseFactory.CreateDatabase();
|
DbCommand dbCommand = db.GetStoredProcCommand("proc_FenYe");
|
db.AddInParameter(dbCommand, "tblName", DbType.AnsiString, "News");
|
db.AddInParameter(dbCommand, "strFields", DbType.AnsiString, "*");
|
db.AddInParameter(dbCommand, "PageSize", DbType.Int32, PageSize);
|
db.AddInParameter(dbCommand, "PageIndex", DbType.Int32, PageIndex);
|
db.AddInParameter(dbCommand, "strOrder", DbType.String, order);
|
db.AddInParameter(dbCommand, "strOrderType", DbType.String, ordertype);
|
db.AddInParameter(dbCommand, "strWhere", DbType.AnsiString, strWhere);
|
return db.ExecuteDataSet(dbCommand);
|
} |
|
/// <summary>计算记录数</summary> |
/// <param name="strWhere">条件</param> |
/// <returns></returns> |
public int CalcCount(string strWhere)
|
{ |
string sql = "select count(1) from News";
|
if (!string.IsNullOrEmpty(strWhere))
|
{
|
sql += " where " + strWhere;
|
}
|
Database db = DatabaseFactory.CreateDatabase();
|
DbCommand dbCommand = db.GetSqlStringCommand(sql);
|
return int.Parse(db.ExecuteScalar(dbCommand).ToString());
|
} |
下面为主要代码:
1、页面引入JS及CSS
<script src="js/jquery-1.4.2.js" type="text/javascript"></script>
|
<script src="js/jquery.pagination.js" type="text/javascript"></script>
|
<link href="Css/pagination.css" rel="stylesheet" type="text/css" />
|
<script src="js/NewsAjaxPager.js" type="text/javascript"></script>
|
2、页面Html代码
<!--内容列表--!> |
<ul id="PageContain" class="newslist">
|
<!--加载图片--!>
|
<li id="loadImg" style=" width:100%; height:60px;text-align:center; margin-top:50px;"><img src="images/loading1.gif"></li>
|
<!--内容会动态输出到这里面--!>
|
</ul>
|
|
<!--页码,id不能改--!> |
<div id="Pagination" class="digg" ></div>
|
3、一般处理程序页面GetNewsList.ashx,根据条件取出分页数据及总条数
<%@ WebHandler Language="C#" Class="GetNewsList" %>
|
|
using System;
|
using System.Web;
|
using System.Data;
|
|
/// <summary> |
/// 获取新闻列表,用于列表页AJAX分页及总条数 |
/// </summary> |
public class GetNewsList : IHttpHandler
|
{ |
|
DAl.NewsDAO newsDao = new DAl.NewsDAO();
|
DAl.ProductCategoryDAO catDao = new DAl.ProductCategoryDAO();
|
|
public void ProcessRequest(HttpContext context)
|
{
|
context.Response.ContentType = "text/plain";
|
|
string action = context.Request["action"];
|
|
if (action == "pager") // 取出分页列表
|
{
|
// 排序字段
|
string order = context.Request["order"].ToString().Trim();
|
string orderType = context.Request["orderType"].ToString().Trim();
|
// 页大小
|
string pageSizeStr = context.Request["pageSize"].ToString().Trim();
|
int pageSize;
|
int.TryParse(pageSizeStr, out pageSize);
|
if (pageSize == 0)
|
{
|
pageSize = 10;
|
}
|
// 页索引
|
string pageIndexStr = context.Request["pageIndex"].ToString().Trim();
|
int pageIndex;
|
int.TryParse(pageIndexStr, out pageIndex);
|
if (pageIndex == 0)
|
{
|
pageIndex = 1;
|
}
|
|
// 提取数据
|
DataTable dt = newsDao.GetList(order, orderType, pageSize, pageIndex, StrWhere(context)).Tables[0];
|
// 讲DataTable转换为Json
|
string jsonDate = Common.WebHelper.DataTableToJSON(dt, "ListData");
|
context.Response.Write(jsonDate);
|
}
|
else if (action == "pageCount") // 获取总条数
|
{
|
context.Response.Write(newsDao.CalcCount(StrWhere(context)));
|
}
|
|
}
|
|
|
/// <summary>
|
/// 查询条件
|
/// </summary>
|
private string StrWhere(HttpContext context)
|
{
|
string strWhere = "IsShow=\'1\'";
|
string Id = context.Request["cid"].ToString().Trim();
|
if (!string.IsNullOrEmpty(Id)&&Common.WebHelper.IsPosInt(Id))
|
{
|
catDao.GetAllChildCatId(Id, ref Id);
|
strWhere += "and CategoryID in (" + Id + ")"; // ref Id
|
}
|
return strWhere;
|
}
|
|
|
|
public bool IsReusable
|
{
|
get
|
{
|
return false;
|
}
|
}
|
|
} |
DataTable转换为Json的函数
/* |
* 创建人:余泳彬
|
* 创建时间:2011-1-17 9:59:50
|
* 说明:网站帮助类(常用通用类)
|
* 版权所有:余泳彬
|
*/
|
using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using System.Security.Cryptography;
|
using System.Text.RegularExpressions;
|
using System.Web;
|
using System.Web.UI;
|
using System.Web.UI.WebControls;
|
using System.Data;
|
using System.IO;
|
using Newtonsoft.Json; // 需先添加引用
|
|
namespace Common
|
{ |
/// <summary>网站帮助类</summary>
|
public class WebHelper
|
{
|
/// <summary>将DateTable转为Json格式数据</summary>
|
/// <param name="dt">要转换的DataTable名称</param>
|
/// <param name="dtName">应该是转换后的Key如用Json.dtName得到数据</param>
|
/// <returns></returns>
|
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();
|
}
|
|
}
|
} |
4、★主要的JS代码:(Ajax取出分页数据、总条数、绑定分页控件,讲分页数据HTML输出到前台)
/* |
* 余泳彬 2011-3-22
|
* 利用Jquery的jquery.pagination.js插件进行Ajax分页
|
*/ |
|
|
$(function() {
|
// 获取Url中的类别ID参数(logcheck.js)
|
var CatId = GetQueryString("cid");
|
// 计算分页总条数
|
var pageCount = 0;
|
$.ajax({
|
type: "POST",
|
cache: false,
|
async: false,
|
dataType: "text",
|
url: "Handler/GetNewsList.ashx",
|
data: "action=pageCount&cid=" + CatId,
|
success: function(data) {
|
pageCount = data;
|
//alert(pageCount);
|
}
|
});
|
|
// 初始化数据(显示第一页)
|
InitData(CatId, "CreateDate", "Desc", 20, 0, pageCount);
|
|
//处理翻页,page_id为当前页索引(0为第一页)
|
function pageselectCallback(page_id, jq) {
|
//alert(page_id);
|
InitData(CatId, "CreateDate", "Desc", 20, page_id, pageCount);
|
}
|
|
// ★分页主函数(新闻类别ID,排序字段,排序类型,页大小,页索引,总条数)
|
function InitData(CatId, order, ordertype, PageSize, pageindx, pageCount) {
|
// Ajax取出分页列表数据
|
$.ajax({
|
type: "POST",
|
cache: false,
|
dataType: "json", // 数据格式:JSON
|
url: "Handler/GetNewsList.ashx",
|
data: "action=pager&cid=" + CatId + "&order=" + order + "&orderType=" + ordertype + "&pageSize=" + PageSize + "&pageIndex=" + (pageindx + 1),
|
// 发送数据之前显示Loading图片,接收结束后隐藏
|
beforeSend: function() { $("#loadImg").show(); $("#Pagination").hide() }, // 发送数据之前
|
complete: function() { $("#loadImg").hide(); $("#Pagination").show() }, // 接收数据完毕
|
// Ajax成功
|
success: function(json) {
|
var listDate = json.ListData;
|
var html = "";
|
$.each(listDate, function(i, n) {
|
html += "<li class=\"b\"><span class=\"title\"><a href=\"newscontent.aspx?id=" + n.Id + "%>\" class=\"typelink\" target=\"_blank\">" + n.LongTitle + "</a></span><span class=\"date\">" + n.CreateDate + "</span></li>";
|
});
|
// 输出HTML
|
$("#PageContain").html(html);
|
}
|
|
}); // Ajax_end
|
|
|
// 加入分页插件的绑定,第一个参数pageCount为总共多少条数据
|
$("#Pagination").pagination(pageCount, {
|
callback: pageselectCallback,
|
prev_text: \'« 上一页\',
|
next_text: \'下一页 »\',
|
items_per_page: PageSize, // 每页显示条数
|
current_page: pageindx, // 当前页索引,这里0为第一页
|
num_display_entries: 6, // 前面显示几个按钮
|
num_edge_entries: 2 // 后面显示几个按钮
|
});
|
|
} // InitData_fun_end
|
|
|
}); // ready_end
|
实例完整源码:源码与上面所写稍有不同
jQueryPager(JQuery分页插件pagination实现Ajax分页).rar
二、使用aspnetpager分页控件实现分页:
控件下载及演示地址:http://www.webdiyer.com/
存储过程和数据访问层所用的代码和上面的一样
1、添加AspNetPager控件到Vs控件工具箱,方便以后随时调用(如这里添加到“常规”一栏)
点击“常规”→右键“选择项”→“.Net Framework组件”→“浏览”→选择下载文件中的“AspNetPager.dll”
添加成功就会在常规工具箱出现“AspNetPager”控件了
2、引用AspNetPager控件(方法和其他一样,拖动到指定位置即可)
讲分页控件拖动到页面时头部就会自动添加
<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>
分页区域,控件代码:(可在属性栏设置相应属性)
<webdiyer:aspnetpager CssClass="pages" CurrentPageButtonClass="cpb" ID="anp" |
runat="server" |
CustomInfoHTML="当前第%CurrentPageIndex%/%PageCount%页,每页%PageSize%条,共%RecordCount%条" |
FirstPageText="|<<" LastPageText=">>|" |
PageIndexBoxType="TextBox" PageSize="20" ShowCustomInfoSection="Left" |
ShowPageIndexBox="Never" NumericButtonCount="5" |
LayoutType="Div" CustomInfoClass="pages_left" onpagechanged="anp_PageChanged" |
CustomInfoSectionWidth="40%" UrlPaging="True">
|
</webdiyer:aspnetpager> |
3、显示分页数据
这里用repeater绑定数据
<asp:Repeater ID="repList" runat="server">
|
<ItemTemplate> |
<li class="b">
|
<span class="title">
|
<a href="newscontent.aspx?id=<%#Eval("Id")%>" class="typelink" target="_blank"><%#Eval("LongTitle")%></a></span>
|
<span class="date"><%#Eval("CreateDate")%></span>
|
</li> |
</ItemTemplate> |
</asp:Repeater> |
后台.cs代码
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Web;
|
using System.Web.UI;
|
using System.Web.UI.WebControls;
|
|
public partial class newslist : System.Web.UI.Page
|
{ |
DAl.NewsDAO newsDao = new DAl.NewsDAO();
|
|
protected void Page_Load(object sender, EventArgs e)
|
{
|
if (!IsPostBack)
|
{
|
// 计算分页总条数
|
anp.RecordCount = newsDao.CalcCount("");
|
// 绑定列表
|
repListBind();
|
}
|
}
|
|
/// <summary>绑定列表数据</summary>
|
private void repListBind()
|
{
|
// 绑定repeater
|
repList.DataSource = newsDao.GetList("CreateDate", "desc", anp.PageSize, anp.CurrentPageIndex, "");
|
repList.DataBind();
|
}
|
|
// 分页事件
|
protected void anp_PageChanged(object sender, EventArgs e)
|
{
|
repListBind();
|
}
|
} |
A:分页之前必须计算数据总条数,并赋值给AspNetPager的RecordCount属性
B:将分页控件的PageSize(页大小)属性、CurrentPageIndex(当前页索引)属性,传递给提取分页数据的函数
C:设置分页控件的 onpagechanged 事件,即当页码改变时,重新绑定分页数据列表