前段時間寫程式,用到了ajax的無重新整理分頁。我學的時候是跟“傳智播客”學的,那個視頻很不錯。
核心流程:通過查詢資料庫,用“一共有多少條資料”/“每頁有多少條資料”=“一共有多少頁”,得到一共有多少頁。這樣就可以顯示頁碼部分。
通過查詢要現實的資料,得到一個datatable(查詢結果),序列化後,傳到用戶端,就實現了商品現實部分。
現在把原理和代碼分享一下:
1.需要兩個SQL語句(寫成預存程序更好):
(1)返回一共有多少條資料:
select count(*) from table
(2)返回第m條到第n條資料的DataTable
select top(10) * from table where id not in(
select top(20) from table where 條件 order by id desc)
and (條件) order by id desc //適用於各個版資料庫
2.寫一個一般處理常式,這個程式會接受ajax傳來的參數,並在處理後,調用上面的兩句SQL語句返回相應的值:
(1)可通過傳入的參數(參數:1.要返回第幾頁;2.每頁多少條資料;3.action),返回相應的資料DataTable或一共有多少頁
(2)具體思路:a.判斷action來確定返回的是(1.返回一共多少頁 2.返回相應頁碼的DataTable)
b.通過,每頁有多少條資料,一共有多少條資料,計算一共有多少頁
c.通過,每頁有多少條資料,需要的資料的頁碼,返回需要的資料
3.具體代碼如下:注意用json序列化DataTable會出錯,要先把DataTable變成List<>的
(1)一般處理常式.ashx
public class PagedService : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//context.Response.Write("Hello World");
productManager pM;
//檢查要返回的是 商品數量 還是 商品資訊列表
string action = context.Request["action"];
string tablename = context.Request["tablename"];
string type3id = context.Request["type3id"];
if (action == "getproductcount")
{
pM = new productManager();
//要返回的是 商品數量
int i = pM.GetProductCount(tablename, type3id);
context.Response.Write(i);
}
else if (action == "getpagedate")
{
pM = new productManager();
//要返回的是 商品資訊列表
string selectcount = context.Request["selectcount"];
string pageindex = context.Request["pageindex"];
var data = pM.GetPageDate(tablename, type3id, selectcount, pageindex);
List<Comment> list = new List<Comment>();
for (int i = 0; i < data.Rows.Count; i++)
{
var row = data.Rows[i];
string thetype3id = data.Rows[i]["type3id"].ToString();
type3Manager t3M = new type3Manager();
string TheTableName = t3M.getTableNameByType3Id(thetype3id).Trim();
list.Add(new Comment()
{
id = row ["id"].ToString(),
productname = row["productname"].ToString(),
imagepath = row["imagepath"].ToString(),
discribe = row["discribe"].ToString(),
price = row["price"].ToString(),
TableName = TheTableName
});
}
JavaScriptSerializer jss = new JavaScriptSerializer();
context.Response.Write(jss.Serialize(list));
}
}
public class Comment
{
public string id { get; set; }
public string productname { get; set; }
public string imagepath { get; set; }
public string discribe { get; set; }
public string price { get; set; }
public string TableName { get; set; }//後加的屬性,為了a標籤跳轉
}
public bool IsReusable
{
get
{
return false;
}
}
}
(2)前台jquery的ajax代碼
$.post("../PagedService.ashx",{"action":"getpagedate","selectcount":SelectCount,
"pageindex":pageindex,"tablename":TableName,
"Type3Id":Type3Id},function(data,status){}