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

功能说明:

        由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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stoneson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值