天天看點

基于jQuery的AJAX和JSON實作純html資料模闆

通過jQuery内置的AJAX功能,直接通路背景獲得JSON格式的資料,然後通過jQuer把資料綁定到事先設計好的html模闆上,直接在頁面上顯示。

我們先來看一下html模闆: 

<table id="datas" border="1" cellspacing="0" style="border-collapse: collapse">

<tr>

<th>

訂單ID</th>

客戶ID</th>

雇員ID</th>

訂購日期</th>

發貨日期</th>

貨主名稱</th>

貨主位址</th>

貨主城市</th>

更多資訊</th>

</tr>

<tr id="template">

<td id="OrderID">

</td>

<td id="CustomerID">

<td id="EmployeeID">

<td id="OrderDate">

<td id="ShippedDate">

<td id="ShippedName">

<td id="ShippedAddress">

<td id="ShippedCity">

<td id="more">

</table>

一定要注意的就是裡面所有的id屬性,這個是一個關鍵。再來看一下AJAX請求和綁定資料的代碼。 

$.ajax(...{

type: "get",//使用get方法通路背景

dataType: "json",//傳回json格式的資料

url: "BackHandler.ashx",//要通路的背景位址

data: "pageIndex=" + pageIndex,//要發送的資料

complete :function()...{$("#load").hide();},//AJAX請求完成時隐藏loading提示

success: function(msg)...{//msg為傳回的資料,在這裡做資料綁定

var data = msg.table;

$.each(data, function(i, n)...{

var row = $("#template").clone();

row.find("#OrderID").text(n.訂單ID);

row.find("#CustomerID").text(n.客戶ID);

row.find("#EmployeeID").text(n.雇員ID);

row.find("#OrderDate").text(ChangeDate(n.訂購日期));

if(n.發貨日期!== undefined) row.find("#ShippedDate").text(ChangeDate(n.發貨日期));

row.find("#ShippedName").text(n.貨主名稱);

row.find("#ShippedAddress").text(n.貨主位址);

row.find("#ShippedCity").text(n.貨主城市);

row.find("#more").html("<a href=OrderInfo.aspx?id=" + n.訂單ID + "&pageindex="+pageIndex+"> More</a>"); 

row.attr("id","ready");//改變綁定好資料的行的id

row.appendTo("#datas");//添加到模闆的容器中

});

這個是jQuery的AJAX方法,傳回資料并不複雜,主要說明一下怎麼把資料按模闆的定義顯示到到頁面上。首先是這個“var row = $("#template").clone();”先把模闆複制一份,接下來row.find("#OrderID").text(n.訂單ID);,表示找到id=OrderID的标記,設定它的innerText為相應的資料,當然也可以設定為html格式的資料。或者是通過外部的函數把資料轉換成需要的格式,比如這裡row.find("#OrderDate").text(ChangeDate(n.訂購日期));有點伺服器控件做模闆綁定資料的感覺。

所有的這些,都是放在一個靜态的頁面裡,隻通過AJAX方法從背景擷取資料,所有html代碼如下:

<head>

<title>test1</title>

<script language="javascript" type="text/javascript" src="js/jquery-latest.pack.js"></script>

<script language="javascript" type="text/javascript" src="js/PageDate.js"></script>

</head>

<body>

<div>

 <div>

<br />

<input id="first" type="button" value=" << " /><input id="previous" type="button"

value=" < " /><input id="next" type="button" value=" > " /><input id="last" type="button"

value=" >> " />

 <span id="pageinfo"></span>

</div>

<div id="load" style="left: 0px; position: absolute; top: 0px; background-color: red">

LOADING....

<input type="hidden" id="pagecount" />

</body>

</html>

PageData.js就是包括上面AJAX請求和綁定資料代碼的js,整個頁面連form都不用,這樣做有什麼好處呢。再看下面一個模闆

<ul id="datas">

<li id="template">

<span id="OrderID">

fsdfasdf

</span>

<span id="CustomerID">

<span id="EmployeeID">

<span id="OrderDate">

<span id="ShippedDate">

<span id="ShippedName">

<span id="ShippedAddress">

<span id="ShippedCity">

<span id="more">

</li>

</ul>

還是要注意id屬性。大家看到這裡應該明白了,不管用什麼樣的表現形式,隻要id屬性相同,就可以把資料綁定到對應的位置。這樣的話,我們這些做程式的就不會因為美工的修改而修改代碼了,而且美工也隻要做出html就可以了,不需要為伺服器控件做模闆(不過我還沒遇到過這樣的美工,都是美工設計好了我來改成伺服器控件的模闆)。

再簡單說一下AJAX請求的背景,用的是Access的Northwind資料庫,把訂單表放到DataTable裡,然後通過DataTable2JSON轉化成JSON資料格式傳回來就完了,不過背景用了一些分頁和緩存的方法,希望對初學者有一些幫助。

ps:DataTable轉換成JSON字元串的函數

直接分解DataTable,然後用StringBuilder來構造成JSON格式也不是很複雜。函數代碼如下:

private string DataTable2Json(DataTable dt)

{

StringBuilder jsonBuilder = new StringBuilder();

jsonBuilder.Append("{\"");

jsonBuilder.Append(dt.TableName);

jsonBuilder.Append("\":[");

for (int i = 0; i < dt.Rows.Count; i++)

jsonBuilder.Append("{");

for (int j = 0; j < dt.Columns.Count; j++)

jsonBuilder.Append("\"");

jsonBuilder.Append(dt.Columns[j].ColumnName);

jsonBuilder.Append("\":\"");

jsonBuilder.Append(dt.Rows[i][j].ToString());

jsonBuilder.Append("\",");

}

jsonBuilder.Remove(jsonBuilder.Length - 1, 1);

jsonBuilder.Append("},");

jsonBuilder.Append("]");

jsonBuilder.Append("}");

return jsonBuilder.ToString();

這一行“jsonBuilder.Remove(jsonBuilder.Length - 1, 1);”是為了去掉最後一個多于的逗号

本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1081651