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

之前一篇参见:

ASP.NET JS+Sql无限级树型菜单

上一篇是在后台实现的,这次改造为AJAX实现,注意先看一下其中的dTree的API。

功能说明:

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


 

 

 

转载于:https://www.cnblogs.com/Ferry/archive/2010/08/03/1791439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值