最近同事问用ASP.NET AJAX Call Web Service可以返回DataTable吗?现在公司项目的后台很多都直用AJAX作掉,达到异步的效果,目前公司的作法是用Web Service回传一个 List 到前端给JavaScript作Parse,Parse过程花调许多程序与性能,所以问题来了,如果能直接返回DataTable该有多好啊!?
最近同事问用ASP.NET AJAX Call Web Service可以返回DataTable吗?
现在公司项目的后台很多都直用AJAX作掉,达到异步的效果,
目前公司的作法是用Web Service回传一个 List 到前端给JavaScript作Parse,
Parse过程花调许多程序与性能,所以问题来了,如果能直接返回DataTable该有多好啊!?
是的,要回传DataTable其实是可行的,使用ASP.NET 2.0 AJAX Futures 的确有方法可以作到,
只不过,该Solution目前还是CTP,且满久了,不知何时才会发布正式版,还是石沉大海了?
后来我提出了一个解决方案,也可以达到"感觉像"返回一个DataTable,那就是使用JSON,
这里使用一个C# Class来作解析,可直接传入DataTable到这个类里的Method当参数,
该Method会教这个DataTable提炼成JSON的Format String,所以该Web Service回传类型是一个String Type,
C# Class (DT2JSON) 如下:
001 using ...System.Data;002 using System.Text;
003
004 public class DT2JSON
005 ...{
006 /////
007 /// 将DataTable转换成JSON格式字符串 (不可指定查询字段)
008 /// JavaScript使用方式:OBJ.Table[0].Row[0].Cell[0].Data
009 ///
010 /// DataTable
011 ///
012 public static string JSON_DataTable(DataTable dt)
013 ...{
014 StringBuilder JsonString = new StringBuilder();
015 JsonString.Append("...{ "");
016 JsonString.Append(""Table":[...{ "
043 JsonString.Append("]}]});
044 return JsonString.ToString();
045 });
017 JsonString.Append(""Row":[ ");
018 for (int i = 0; i < dt.Rows.Count; i++)
019 ...{
020 JsonString.Append("...{ "
038 else
039 ...{
040 JsonString.Append("]});
041 }, ");
021 JsonString.Append(""Cell":[ ");
022 for (int j = 0; j < dt.Columns.Count; j++)
023 ...{
024 if (j < dt.Columns.Count - 1)
025 ...{
026 JsonString.Append("...{"," + ""Value":"" + dt.Rows[i][j].ToString() + ""});
027 }
028 else if (j == dt.Columns.Count - 1)
029 ...{
030 JsonString.Append("...{"" + ""Value":"" + dt.Rows[i][j].ToString() + ""});
031 }
032 }
033
034 if (i == dt.Rows.Count - 1)
035 ...{
036 JsonString.Append("]});
037 } "
042 }
046
047 /////
048 /// 将DataTable转换成JSON格式字符串 (可指定查询字段)
049 /// JavaScript使用方式:OBJ.Data[0].Name
050 ///
051 /// DataTable
052 ///
053 public static string CreateJsonParameters(DataTable dt)
054 ...{
055 StringBuilder JsonString = new StringBuilder();
056 if (dt != null && dt.Rows.Count > 0)
057 ...{
058 JsonString.Append("...{ "
084 JsonString.Append("]});
085 return JsonString.ToString();
086 });
059 JsonString.Append(""Data":[ ");
060 for (int i = 0; i < dt.Rows.Count; i++)
061 ...{
062 JsonString.Append("...{ "
079 else
080 ...{
081 JsonString.Append("});
082 }, ");
063 for (int j = 0; j < dt.Columns.Count; j++)
064 ...{
065 if (j < dt.Columns.Count - 1)
066 ...{
067 JsonString.Append(""" + dt.Columns[j].ColumnName.ToString() + "":" + """ + dt.Rows[i][j].ToString() + "",");
068 }
069 else if (j == dt.Columns.Count - 1)
070 ...{
071 JsonString.Append(""" + dt.Columns[j].ColumnName.ToString() + "":" + """ + dt.Rows[i][j].ToString() + """);
072 }
073 }
074
075 if (i == dt.Rows.Count - 1)
076 ...{
077 JsonString.Append("});
078 } "
083 }"
087 else
088 ...{
089 return null;
090 }
091 }
092
093 /////
094 /// 将DataTable转换成JSON格式字符串 (可指定查询字段)
095 /// JavaScript使用方式:OBJ.[DataTable名称][0].Name
096 ///
097 /// DataTable名称
098 /// DataTable
099 ///
100 public static string CreateJsonParameters(string dtName, DataTable dt)
101 ...{
102 StringBuilder JsonString = new StringBuilder();
103 if (dt != null && dt.Rows.Count > 0)
104 ...{
105 JsonString.Append("...{ "
131 JsonString.Append("]});
132 return JsonString.ToString();
133 });
106 JsonString.AppendFormat(""...{0}":[ ", dtName.Trim());
107 for (int i = 0; i < dt.Rows.Count; i++)
108 ...{
109 JsonString.Append("...{ "
126 else
127 ...{
128 JsonString.Append("});
129 }, ");
110 for (int j = 0; j < dt.Columns.Count; j++)
111 ...{
112 if (j < dt.Columns.Count - 1)
113 ...{
114 JsonString.Append(""" + dt.Columns[j].ColumnName.ToString() + "":" + """ + dt.Rows[i][j].ToString() + "",");
115 }
116 else if (j == dt.Columns.Count - 1)
117 ...{
118 JsonString.Append(""" + dt.Columns[j].ColumnName.ToString() + "":" + """ + dt.Rows[i][j].ToString() + """);
119 }
120 }
121
122 if (i == dt.Rows.Count - 1)
123 ...{
124 JsonString.Append("});
125 } "
130 }"
134 else
135 ...{
136 return null;
137 }
138 }
139 }
Web Service Method使用方式:
01 [WebMethod]02 public string GetDataTable()
03 ...{
04 DataTable dt = new DataTable();
05
06 dt.Columns.Add(new DataColumn("Name", typeof(string)));
07 dt.Columns.Add(new DataColumn("LastName", typeof(string)));
08 dt.Columns.Add(new DataColumn("Email", typeof(string)));
09
10 dt.Rows.Add("何", "若瑄", "[email protected]");
11 dt.Rows.Add("毛", "俊杰", "[email protected]");
12
13 return DT2JSON.JSON_DataTable(dt);
14 }
ASPX JavaScript 使用方式,这里是采jQuery的作法,JavaScript作法也差不多,
调用用法可以参数C# Class,我有写在注解里。
这里引进了3个JS File
第一个是jQuery主程序
第二个是可以让VS 2008 SP1支持jQuery intellisense
第三个是jQuery Plugin,用它来Parse JSON (下载)
02
03
04
就这样,简简单单就可以调用JSON的数据,网页间传递数据使用JSON真的挺方便的,
值得一提的是JSON的速度比较快,用起来感觉像Array,而XML呢?虽然速度比JSON慢一滴滴,
但能表现的数据格式可就非常强大的柳!
原文:大专栏 ASP.NET AJAX Call Web Service , Return JSON Format String