ASP.NET AJAX 无限级 JS 树形菜单

    技术2024-07-23  62

    功能说明:

            由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;     } }

    最新回复(0)