基于jQuery的AJAX和JSON实现纯html数据模板
2011-04-28 08:17 沐海 阅读(5574) 评论(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.}