功能说明:
由Tree.html中的JQuery AJAX代码发起HTTP请求到GetTreeData.aspx获取JSON格式的字符串,然后在Tree.html中将字符串格式化为JSON格式,用dTree函数递归构造JS Tree。
步骤:
1)创建Menu类(为了构造List<T>泛型集合)
2)创建FormatToJson类
3)创建GetTreeData.aspx窗体,添加后台实现代码
4)创建Tree.html,并处理数据递归绑定Tree
1、Tree.html
<!-- Tree.html --> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > < html xmlns ="http://www.w3.org/1999/xhtml" > < head > < title ></ title > < script type ="text/javascript" src ="Scripts/dtree.js" ></ script > < script type ="text/javascript" src ="Scripts/jquery-1.4.1.js" ></ script > < script type ="text/javascript" > d = new dTree( ' d ' ); d.add( 0 , - 1 , ' 模块列表 ' ); function getData(id) { $.ajax({ url: ' TreeSource/GetTreeData.aspx?parentID= ' + id, type: ' post ' , datatype: ' json ' , success: function (returnJsonValue) { if (returnJsonValue.length > 0 ) { // 格式化为JSON数据格式 var json = eval( " ( " + returnJsonValue + " ) " ); // document.write(json.Menu[0].MenuName); // 遍历集合,添加树节点 $.each(json.Menu, function (key, value) { if (id == 0 ) { d.add(value.ID, value.ParentMenuID, value.MenuName, value.MenuClickURL, value.MenuName, ' mainFrame ' , ' images/Tree/folder.gif ' , ' images/Tree/folderopen.gif ' ); } else { d.add(value.ID, value.ParentMenuID, value.MenuName, value.MenuClickURL, value.MenuName, ' mainFrame ' ); } // 根据模块的ParentID递归绑定数据 getData(value.ID); }) } else { $( " #divTree " ).html(d.toString()); // 数据请求完毕,隐藏图片 $( " #imgLoading " ).hide(); } } }) } $(getData( 0 )); </ script > < style type ="text/css" > img { border : 0px ; } </ style > </ head > < body > <!-- 数据请求完成之前显示 --> < img id ="imgLoading" src ="Images/Loading/loading01.gif" alt ="正在加载..." /> <!-- 显示树形列表 --> < div id ="divTree" > </ div > </ body > </ html >
2、请求数据的ASP.NET网页后台代码(前台清空就剩Page命令那一行就可以了)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using DAO; using System.Data; using System.Text; using System.Reflection; public partial class TreeSource_GetTreeData : System.Web.UI.Page { SqlHelper helper = new SqlHelper(); protected void Page_Load( object sender, EventArgs e) { if ( ! IsPostBack) { this .GetMenuByParentID(); } } private void GetMenuByParentID() { if (ParentID != null ) { DataTable dt = helper.FillDataTable(String.Format( " SELECT * FROM SunZonTMSMenu WHERE ParentMenuID={0} AND IsOpen=1 " , ParentID.ToString() )); IList < Menu > menu = new List < Menu > (); if (dt != null && dt.Rows.Count > 0 ) { foreach (DataRow dr in dt.Rows) { menu.Add( new Menu() { ID = Int32.Parse(dr[ " ID " ].ToString()), ParentMenuID = Int32.Parse(dr[ " ParentMenuID " ].ToString()), MenuName = dr[ " MenuName " ].ToString(), MenuCode = dr[ " MenuCode " ].ToString(), MenuClickURL = dr[ " MenuClickURL " ].ToString() }); } } if (menu.Count > 0 ) { Response.Write(FormatToJson.ListToJson < Menu > (menu)); } } } // 上级Menu的ID private Int32 ? ParentID { get { try { return Int32.Parse(Request.QueryString[ " parentID " ]); } catch { return null ; } } } }
3、使用到的Menu实体类
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> /// Summary description for Menu /// </summary> public class Menu { public Menu() { // // TODO: Add constructor logic here // } public int ID { get ; set ; } public int ParentMenuID { get ; set ; } public string MenuName { get ; set ; } public string MenuCode { get ; set ; } public string MenuClickURL { get ; set ; } }
4、使用的构造JSON数据格式的类(此类不是本人写的,来源于互联网)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.Reflection; using System.Collections; using System.Data; using System.Data.Common; /// <summary> /// Summary description for FormatToJson /// </summary> public class FormatToJson { public FormatToJson() { // // TODO: Add constructor logic here // } /// <summary> /// List转成json /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jsonName"></param> /// <param name="list"></param> /// <returns></returns> public static string ListToJson < T > (IList < T > list, string jsonName) { StringBuilder Json = new StringBuilder(); if ( string .IsNullOrEmpty(jsonName)) jsonName = list[ 0 ].GetType().Name; Json.Append( " {/ "" + jsonName + " / " :[ " ); if (list.Count > 0 ) { for ( int i = 0 ; i < list.Count; i ++ ) { T obj = Activator.CreateInstance < T > (); PropertyInfo[] pi = obj.GetType().GetProperties(); Json.Append( " { " ); for ( int j = 0 ; j < pi.Length; j ++ ) { Type type = pi[j].GetValue(list[i], null ).GetType(); Json.Append( " / "" + pi[j].Name.ToString() + " / " : " + StringFormat(pi[j].GetValue(list[i], null ).ToString(), type)); if (j < pi.Length - 1 ) { Json.Append( " , " ); } } Json.Append( " } " ); if (i < list.Count - 1 ) { Json.Append( " , " ); } } } Json.Append( " ]} " ); return Json.ToString(); } /// <summary> /// List转成json /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <returns></returns> public static string ListToJson < T > (IList < T > list) { object obj = list[ 0 ]; return ListToJson < T > (list, obj.GetType().Name); } /// <summary> /// 对象转换为Json字符串 /// </summary> /// <param name="jsonObject"> 对象 </param> /// <returns> Json字符串 </returns> public static string ToJson( object jsonObject) { string jsonString = " { " ; PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties(); for ( int i = 0 ; i < propertyInfo.Length; i ++ ) { object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null ); string value = string .Empty; if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan) { value = " ' " + objectValue.ToString() + " ' " ; } else if (objectValue is string ) { value = " ' " + ToJson(objectValue.ToString()) + " ' " ; } else if (objectValue is IEnumerable) { value = ToJson((IEnumerable)objectValue); } else { value = ToJson(objectValue.ToString()); } jsonString += " / "" + ToJson(propertyInfo[i].Name) + " / " : " + value + " , " ; } jsonString.Remove(jsonString.Length - 1 , jsonString.Length); return jsonString + " } " ; } /// <summary> /// 对象集合转换Json /// </summary> /// <param name="array"> 集合对象 </param> /// <returns> Json字符串 </returns> public static string ToJson(IEnumerable array) { string jsonString = " [ " ; foreach ( object item in array) { jsonString += ToJson(item) + " , " ; } jsonString.Remove(jsonString.Length - 1 , jsonString.Length); return jsonString + " ] " ; } /// <summary> /// 普通集合转换Json /// </summary> /// <param name="array"> 集合对象 </param> /// <returns> Json字符串 </returns> public static string ToArrayString(IEnumerable array) { string jsonString = " [ " ; foreach ( object item in array) { jsonString = ToJson(item.ToString()) + " , " ; } jsonString.Remove(jsonString.Length - 1 , jsonString.Length); return jsonString + " ] " ; } /// <summary> /// Datatable转换为Json /// </summary> /// <param name="table"> Datatable对象 </param> /// <returns> Json字符串 </returns> public static string ToJson(DataTable dt) { StringBuilder jsonString = new StringBuilder(); jsonString.Append( " [ " ); DataRowCollection drc = dt.Rows; for ( int i = 0 ; i < drc.Count; i ++ ) { jsonString.Append( " { " ); for ( int j = 0 ; j < dt.Columns.Count; j ++ ) { string strKey = dt.Columns[j].ColumnName; string strValue = drc[i][j].ToString(); Type type = dt.Columns[j].DataType; jsonString.Append( " / "" + strKey + " / " : " ); strValue = StringFormat(strValue, type); if (j < dt.Columns.Count - 1 ) { jsonString.Append(strValue + " , " ); } else { jsonString.Append(strValue); } } jsonString.Append( " }, " ); } jsonString.Remove(jsonString.Length - 1 , 1 ); jsonString.Append( " ] " ); return jsonString.ToString(); } /// <summary> /// DataTable转成Json /// </summary> /// <param name="jsonName"></param> /// <param name="dt"></param> /// <returns></returns> public static string ToJson(DataTable dt, string jsonName) { StringBuilder Json = new StringBuilder(); if ( string .IsNullOrEmpty(jsonName)) jsonName = dt.TableName; Json.Append( " {/ "" + jsonName + " / " :[ " ); if (dt.Rows.Count > 0 ) { for ( int i = 0 ; i < dt.Rows.Count; i ++ ) { Json.Append( " { " ); for ( int j = 0 ; j < dt.Columns.Count; j ++ ) { Type type = dt.Rows[i][j].GetType(); Json.Append( " / "" + dt.Columns[j].ColumnName.ToString() + " / " : " + StringFormat(dt.Rows[i][j].ToString(), type)); if (j < dt.Columns.Count - 1 ) { Json.Append( " , " ); } } Json.Append( " } " ); if (i < dt.Rows.Count - 1 ) { Json.Append( " , " ); } } } Json.Append( " ]} " ); return Json.ToString(); } /// <summary> /// DataReader转换为Json /// </summary> /// <param name="dataReader"> DataReader对象 </param> /// <returns> Json字符串 </returns> public static string ToJson(DbDataReader dataReader) { StringBuilder jsonString = new StringBuilder(); jsonString.Append( " [ " ); while (dataReader.Read()) { jsonString.Append( " { " ); for ( int i = 0 ; i < dataReader.FieldCount; i ++ ) { Type type = dataReader.GetFieldType(i); string strKey = dataReader.GetName(i); string strValue = dataReader[i].ToString(); jsonString.Append( " / "" + strKey + " / " : " ); strValue = StringFormat(strValue, type); if (i < dataReader.FieldCount - 1 ) { jsonString.Append(strValue + " , " ); } else { jsonString.Append(strValue); } } jsonString.Append( " }, " ); } dataReader.Close(); jsonString.Remove(jsonString.Length - 1 , 1 ); jsonString.Append( " ] " ); return jsonString.ToString(); } /// <summary> /// DataSet转换为Json /// </summary> /// <param name="dataSet"> DataSet对象 </param> /// <returns> Json字符串 </returns> public static string ToJson(DataSet dataSet) { string jsonString = " { " ; foreach (DataTable table in dataSet.Tables) { jsonString += " / "" + table.TableName + " / " : " + ToJson(table) + " , " ; } jsonString = jsonString.TrimEnd( ' , ' ); return jsonString + " } " ; } /// <summary> /// 过滤特殊字符 /// </summary> /// <param name="s"></param> /// <returns></returns> private static string String2Json(String s) { StringBuilder sb = new StringBuilder(); for ( int i = 0 ; i < s.Length; i ++ ) { char c = s.ToCharArray()[i]; switch (c) { case ' /" ' : sb.Append( " /// "" ); break; case ' // ' : sb.Append( " " ); break ; case ' / ' : sb.Append( " /// " ); break ; case ' /b ' : sb.Append( " //b " ); break ; case ' /f ' : sb.Append( " //f " ); break ; case ' /n ' : sb.Append( " //n " ); break ; case ' /r ' : sb.Append( " //r " ); break ; case ' /t ' : sb.Append( " //t " ); break ; default : sb.Append(c); break ; } } return sb.ToString(); } /// <summary> /// 格式化字符型、日期型、布尔型 /// </summary> /// <param name="str"></param> /// <param name="type"></param> /// <returns></returns> private static string StringFormat( string str, Type type) { if (type == typeof ( string )) { str = String2Json(str); str = " / "" + str + " / "" ; } else if (type == typeof (DateTime)) { str = " / "" + str + " / "" ; } else if (type == typeof ( bool )) { str = str.ToLower(); } return str; } }