基于jQuery的AJAX和JSON实现纯html数据模板
2011-04-28 08:17 沐海 阅读(5657) 评论(0) 编辑 收藏 举报通过jQuery内置的AJAX功能,直接访问后台获得JSON格式的数据,然后通过jQuer把数据绑定到事先设计好的html模板上,直接在页面上显示。
我们先来看一下html模板:
<!--[if !vml]--><!--[endif]--> HTML代码1.
<
TABLE
style
=
"BORDER-COLLAPSE: collapse"
id
=
datas
border
=
1
cellSpacing
=
0
><
TBODY
><
TR
><
TH
>订单ID</
TH
><
TH
>客户ID</
TH
><
TH
>雇员ID</
TH
><
TH
>订购日期</
TH
><
TH
>发货日期</
TH
><
TH
>货主名称</
TH
><
TH
>货主地址</
TH
><
TH
>货主城市</
TH
><
TH
>更多信息</
TH
></
TR
><
TR
id
=
template
><
TD
id
=
OrderID
> </
TD
><
TD
id
=
CustomerID
> </
TD
><
TD
id
=
EmployeeID
> </
TD
><
TD
id
=
OrderDate
> </
TD
><
TD
id
=
ShippedDate
> </
TD
><
TD
id
=
ShippedName
> </
TD
><
TD
id
=
ShippedAddress
> </
TD
><
TD
id
=
ShippedCity
> </
TD
><
TD
id
=
more
> </
TD
></
TR
></
TBODY
></
TABLE
>
<!--[if !vml]--><!--[endif]-->
一定要注意的就是里面所有的id属性,这个是一个关键。再来看一下AJAX请求和绑定数据的代码。
<!--[if !vml]--><!--[endif]-->
<!--[if !vml]--><!--[endif]--> JavaScript代码
01.
$.ajax(...{
02.
type:
"get"
,
//使用get方法访问后台
03.
dataType:
"json"
,
//返回json格式的数据
04.
url:
"BackHandler.ashx"
,
//要访问的后台地址
05.
data:
"pageIndex="
+ pageIndex,
//要发送的数据
06.
complete :
function
()...{$(
"#load"
).hide();},
//AJAX请求完成时隐藏loading提示
07.
success:
function
(msg)...{
//msg为返回的数据,在这里做数据绑定
08.
var
data = msg.table;
09.
$.each(data,
function
(i, n)...{
10.
var
row = $(
"#template"
).clone();
11.
row.find(
"#OrderID"
).text(n.订单ID);
12.
row.find(
"#CustomerID"
).text(n.客户ID);
13.
row.find(
"#EmployeeID"
).text(n.雇员ID);
14.
row.find(
"#OrderDate"
).text(ChangeDate(n.订购日期));
15.
if
(n.发货日期!== undefined) row.find(
"#ShippedDate"
).text(ChangeDate(n.发货日期));
16.
row.find(
"#ShippedName"
).text(n.货主名称);
17.
row.find(
"#ShippedAddress"
).text(n.货主地址);
18.
row.find(
"#ShippedCity"
).text(n.货主城市);
19.
row.find(
"#more"
).html(
"<A href='OrderInfo.aspx?id="
' n.订单id=
""
> More</A>");
20.
row.attr(
"id"
,
"ready"
);
//改变绑定好数据的行的id
21.
row.appendTo(
"#datas"
);
//添加到模板的容器中
22.
});
<!--[if !vml]--><!--[endif]-->
这个是jQuery的AJAX方法,返回数据并不复杂,主要说明一下怎么把数据按模板的定义显示到到页面上。首先是这个“var row = $("#template").clone();”先把模板复制一份,接下来row.find("#OrderID").text(n.订单ID);,表示找到id=OrderID的标记,设置它的innerText为相应的数据,当然也可以设置为html格式的数据。或者是通过外部的函数把数据转换成需要的格式,比如这里row.find("#OrderDate").text(ChangeDate(n.订购日期));有点服务器控件做模板绑定数据的感觉。
所有的这些,都是放在一个静态的页面里,只通过AJAX方法从后台获取数据,所有html代码如下:
<!--[if !vml]--><!--[endif]-->HTML代码
1.
<
script
language
=
"javascript"
type
=
"text/javascript"
src
=
"js/jquery-latest.pack.js"
></
script
>
2.
<
script
language
=
"javascript"
type
=
"text/javascript"
src
=
"js/PageDate.js"
></
script
>
3.
<
DIV
> <
DIV
><
BR
> <
INPUT
id
=
first
value
=
" << "
type
=
button
><
INPUT
id
=
previous
value
=
" < "
type
=
button
><
INPUT
id
=
next
value=" > " type=button><
INPUT
id
=
last
value=" >> " type=button> <
TABLE
style
=
"BORDER-COLLAPSE: collapse"
id
=
datas
border
=
1
cellSpacing
=
0
><
TBODY
><
TR
><
TH
>订单ID</
TH
><
TH
>客户ID</
TH
><
TH
>雇员ID</
TH
><
TH
>订购日期</
TH
><
TH
>发货日期</
TH
><
TH
>货主名称</
TH
><
TH
>货主地址</
TH
><
TH
>货主城市</
TH
><
TH
>更多信息</
TH
></
TR
><
TR
id
=
template
><
TD
id
=
OrderID
> </
TD
><
TD
id
=
CustomerID
> </
TD
><
TD
id
=
EmployeeID
> </
TD
><
TD
id
=
OrderDate
> </
TD
><
TD
id
=
ShippedDate
> </
TD
><
TD
id
=
ShippedName
> </
TD
><
TD
id
=
ShippedAddress
> </
TD
><
TD
id
=
ShippedCity
> </
TD
><
TD
id
=
more
> </
TD
></
TR
></
TBODY
></
TABLE
></
DIV
> <
DIV
style
=
"POSITION: absolute; BACKGROUND-COLOR: red; TOP: 0px; LEFT: 0px"
id
=
load
>LOADING....</
DIV
> <
INPUT
id
=
pagecount
type
=
hidden
></
DIV
>
<!--[if !vml]--><!--[endif]-->
PageData.js就是包括上面AJAX请求和绑定数据代码的js,整个页面连form都不用,这样做有什么好处呢。再看下面一个模板
<!--[if !vml]--><!--[endif]--> <ul id="datas">
<!--[if !vml]--><!--[endif]--> <li id="template">
<!--[if !vml]--><!--[endif]--> <span id="OrderID">
<!--[if !vml]--><!--[endif]--> fsdfasdf
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> <span id="CustomerID">
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> <span id="EmployeeID">
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> <span id="OrderDate">
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> <span id="ShippedDate">
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> <span id="ShippedName">
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> <span id="ShippedAddress">
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> <span id="ShippedCity">
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> <span id="more">
<!--[if !vml]--><!--[endif]--> </span>
<!--[if !vml]--><!--[endif]--> </li>
<!--[if !vml]--><!--[endif]--> </ul>
把datatable直接序列化为json:
用Newtonsoft.Json.dll进行json序列化,这个从json的官网上就可以找到,使用比较方便。
,然后用StringBuilder来构造成JSON格式也不是很复杂。函数代码如下:
<!--[if !vml]--><!--[endif]--> Java代码
01.
private
string DataTable2Json(DataTable dt)
02.
...{
03.
StringBuilder jsonBuilder =
new
StringBuilder();
04.
jsonBuilder.Append(
"{\""
);
05.
jsonBuilder.Append(dt.TableName);
06.
jsonBuilder.Append(
"\":["
);
07.
for
(
int
i =
0
; i < dt.Rows.Count; i++)
08.
...{
09.
jsonBuilder.Append(
"{"
);
10.
for
(
int
j =
0
; j < dt.Columns.Count; j++)
11.
...{
12.
jsonBuilder.Append(
"\""
);
13.
jsonBuilder.Append(dt.Columns[j].ColumnName);
14.
jsonBuilder.Append(
"\":\""
);
15.
jsonBuilder.Append(dt.Rows[i][j].ToString());
16.
jsonBuilder.Append(
"\","
);
17.
}
18.
jsonBuilder.Remove(jsonBuilder.Length -
1
,
1
);
19.
jsonBuilder.Append(
"},"
);
20.
}
21.
jsonBuilder.Remove(jsonBuilder.Length -
1
,
1
);
22.
jsonBuilder.Append(
"]"
);
23.
jsonBuilder.Append(
"}"
);
24.
return
jsonBuilder.ToString();
25.
}
这一行“jsonBuilder.Remove(jsonBuilder.Length - 1, 1);”是为了去掉最后一个多于的逗号,当然这个函数不能操作比较包含复杂数据类型的DataTable
jQuery操作ajax处理json数据[Demo]
Default.html前台页面代码
HTML代码
01.
02.
<
script
type=”text/javascript” src=”js/jquery-1.2.1.pack.js”></
script
>
03.
<
script
type=”text/javascript”>
04.
$(document).ready(function (){
05.
$(”#btnOK”).click(function (){
06.
$.getJSON(
07.
“Handler.ashx”,
08.
{},
09.
function(json){
10.
$(”#list”).append(”<
LI
>id:”+json.EmployeeId+”|Name:”+json.EmployeeName+”| 年龄:”+json.EmployeeInfo[0]+”|身高:”+json.EmployeeInfo[1]+”|体 重:”+json.EmployeeInfo[2]+”</
LI
>”);
11.
}
12.
)
13.
})
14.
})
15.
</
script
>
16.
17.
<
INPUT
id=”btnOK” value=”加载数据” type=”button”/>
———————
Handler.ashx服务器端处理请求的代码
XHTML代码
01.
<%@ WebHandler Language=”C#” Class=”Handler” %>
02.
03.
using System;
04.
using System.Web;
05.
using System.Web.UI.HtmlControls;
06.
using System.Runtime.Serialization;
07.
using Newtonsoft.Json;
08.
09.
public class Handler : IHttpHandler {
10.
11.
public void ProcessRequest (HttpContext context) {
12.
context.Response.ContentType = “text/plain”;
13.
context.Response.Write(ReturnResult());
14.
}
15.
16.
public string ReturnResult() {
17.
Employee employee = new Employee();
18.
employee.EmployeeId = 1;
19.
employee.EmployeeName = “yang”;
20.
employee.EmployeeInfo = “25,170cm,55kg”.Split(’,');
21.
string jsonstr = JavaScriptConvert.SerializeObject(employee);
22.
return jsonstr;
23.
}
24.
public bool IsReusable {
25.
get {
26.
return false;
27.
}
28.
}
29.
30.
class Employee
31.
{
32.
public int EmployeeId;
33.
public string EmployeeName;
34.
private string[] employeeInfo;
35.
public string[] EmployeeInfo
36.
{
37.
get { return employeeInfo; }
38.
set { employeeInfo = value; }
39.
}
40.
}
41.
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述