当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.net 用XML生成放便扩展的自定义树

ASP.NET
用 Asp.Net 建立一个在线 RSS 新闻聚合器的方法
关于前台调用后台事件__doPostBack函数
Bin 和 App_Code 文件夹介绍
.NET 2.0 的压缩功能代码
解决Visual Studio 2005 无法显示设计视图的方法
asp.net(c#)两种随机数的算法,可用抽考题
asp.net下url传递中文的解决方案
XmlReader 读取器读取内存流 MemoryStream 的注意事项
asp.net下创建、查询、修改带名称空间的 XML 文件的例子
使用.NET存储XML数据的方法
XslTransform.Transform将结果输出到字符串里的方法
安装 VS2005 SP1 有关问题的解决办法
asp.net下中文验证码,免费开源代码
自定义应用程序配置文件(app.config)
asp.net下使用DIME协议上传文件
动态改变ASP.net页面标题和动态指定页面样式表的方法
WEB上调用HttpWebRequest奇怪问题的解决方法
HTTP协议下用Web Service上传大文件的解决方案
asp.net下Response.ContentType类型汇总
ASP.NET User Control使用技巧一则

ASP.NET 中的 asp.net 用XML生成放便扩展的自定义树


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-02-27   浏览: 168 ::
收藏到网摘: n/a

快过年了,公司没有多少工作。闲来无事,共享一下之前为WEB系统所做的放便扩展的自定义树。 数据源为XML,因此放便扩展。
废话不多说,直接上代码(因一些原因,把部分数据修改或精简了)。
XML代码:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<MenuData>
<Module Id="Business" Permissions="49,53,58,59,65,99,100,70,69" Name="业务管理" IsExpand="true">
<Menu Id="Orders" Permissions="49,53,58" Name="我的订单" IsExpand="true">
<Item Permissions="49" IsOnlyVip="true" Name="预订单" Url="Business/ProList.aspx" Title="预订单"/>
<Item Id="Renting" Permissions="53" IsOnlyVip="true" Name="在订单" Url="Business/List.aspx" Title="在订单"/>
<Item Permissions="58" IsOnlyVip="true" Name="订单历史" Url="Business/RList.aspx" Title="订单历史"/>
</Menu>
<Menu Id="Clients" Permissions="59" Name="我的客户" IsExpand="true">
<Item Id="ClientList" Permissions="59" Name="客户列表" Url="Client/List.aspx" Title="客户列表"/>
</Menu>
<Menu Id="" Permissions="65,99,100" Name="我的报表" IsExpand="true">
<Item Permissions="65" IsOnlyVip="true" Name="收入统计" Url="Report/Finance.aspx" Title="收入统计"/>
<Item Permissions="99" IsOnlyVip="true" Name="产品统计" Url="Report/Product.aspx" Title="产品统计"/>
<Item Permissions="100" IsOnlyVip="true" Name="客户统计" Url="Report/Client.aspx" Title="客户统计"/>
</Menu>
<Menu Id="" Permissions="70,69" Name="消息管理" IsExpand="true">
<Item Permissions="70" Name="发送站内消息" Url="" Title="发送站内消息" EventScript="onclick='OpenMsgWindow()'" />
<Item Id="ReceiveMsgList" Permissions="69" Name="消息接收列表" Url="Message/RList.aspx" Title="消息接收列表"/>
<Item Permissions="69" Name="消息发送列表" Url="Message/SList.aspx" Title="消息发送列表"/>
</Menu>
</Module>
<Module Id="Advertise" Permissions="89,90" Name="我要推广" EventScript="OpenTuiGuangIndex();" >
<Menu Id="" Permissions="89" Name="产品推广" Url="TuiGuang/Product.aspx" Title="产品推广"/>
<Menu Id="" Permissions="90" Name="广告推广" Url="TuiGuang/Ad.aspx" Title="广告推广"/>
</Module>
<Module Id="SystemManage" Permissions="67,68" Name="系统设置">
<Menu Id="" Permissions="67" Name="更改系统密码" Url="SysManage/Password.aspx" Title="更改系统密码"/>
<Menu Id="" Permissions="68" Name="系统配置" Url="SysManage/Config.aspx" Title="系统配置"/>
</Module>
<Module Id="VIP" Permissions="" Name="会员介绍" IsUnVip="true">
<Menu Id="" Name="会员介绍" Url="VIP/index.html" Title="会员服务"/>
</Module>
</MenuData>

程序代码:
复制代码 代码如下:

using System.Text;
using System.Collections;
using System.Xml;
using System.Web;
using System;
/// <summary>
/// CreateTree 的摘要说明
/// </summary>
public class MenuTree
{
int index = 0;//菜单栏目ID索引
private ArrayList havePermission = new ArrayList();
private bool isVip = false;
/// <summary>
/// 登录用户所拥有的权限
/// </summary>
private ArrayList HavePermissions
{
get { return havePermission; }
set { havePermission = value; }
}
/// <summary>
/// 登录用户是否是VIP
/// </summary>
private bool IsVip
{
get { return isVip; }
set { isVip = value; }
}
/// <summary>
/// 登录用户所拥有的权限 是否为VIP用户
/// </summary>
/// <param name="havePermission"></param>
/// <param name="isVip"></param>
public MenuTree(ArrayList havePermission, bool isVip)
{
this.HavePermissions = havePermission;
this.IsVip = isVip;
}
/// <summary>
/// 绑定树
/// </summary>
public string BindDataToTree()
{
System.Xml.XmlDocument document = new System.Xml.XmlDataDocument();
document.Load(HttpContext.Current.Server.MapPath("MenuData.xml"));
return CreateTreeHtml(document.DocumentElement, 0);
}
/// <summary>
/// 创建栏目树
/// </summary>
/// <param name="document">xml节点</param>
/// <param name="deep">树深度</param>
private string CreateTreeHtml(System.Xml.XmlNode document, int deep)
{
string nodeType = "Menu";//节点的类型,来生成子节点的CSS类型
StringBuilder treeHtml = new StringBuilder();
foreach (System.Xml.XmlNode node in document.ChildNodes)
{
string menuId = string.Empty;
string treeNodeHtml = string.Empty;
string nodeName = node.Name;
string showName = GetAttributesValue(node.Attributes["Name"]);//显示栏目名
string nodeId = GetAttributesValue(node.Attributes["Id"]);//栏目ID
bool isExpand = GetAttributesValue(node.Attributes["IsExpand"]).ToLower().Trim() == "true" ? true : false;//是否展开
string permissions = GetAttributesValue(node.Attributes["Permissions"]);//权限字串
bool isOnlyVip = GetAttributesValue(node.Attributes["IsOnlyVip"]).ToLower().Trim() == "true" ? true : false;//是否只允许VIP访问
bool isUnVip = GetAttributesValue(node.Attributes["IsUnVip"]).ToLower().Trim() == "true" ? true : false;//是否只准非VIP访问
string eventScript = GetAttributesValue(node.Attributes["EventScript"]);//事件脚本
int chlidNodesCount = node.ChildNodes.Count;//子节点数
bool isPermissions = GetIsPermissions(permissions);//是否有权限
if (!isPermissions)
{
continue; //如果没有权限,不生成此节点
}
if (nodeName == "Module")
{
if (isUnVip && IsVip)
{
continue;//如果为VIP会员 设为不允许访问子栏目
}
menuId = GetMenuId(nodeId);
treeHtml.AppendFormat("<div class='Module' id='Menu{0}' onclick='DoNodes(this);{1}' onselectstart='return false;'>", menuId, eventScript);
treeHtml.Append(" <img src='/images/sideMenuIcon.gif' alt='' /> ");
treeHtml.AppendFormat("<span>{0}</span>", showName);
treeHtml.Append("</div>");
deep = 0;
nodeType = "Module";
}
else
{
treeHtml.Append("<table cellpadding='0' cellspacing='0' style='border-width: 0;width:90%'>");
treeHtml.Append("<tr class='NodeLine'>");
for (int i = 0; i < deep; i++)
{
if (i == deep - 1)
{
treeHtml.Append("<td class='nodeIcoBox'>");
if (chlidNodesCount > 0)
{
menuId = GetMenuId(nodeId);
treeHtml.AppendFormat("<a id='Menu{0}' href='javascript:;' onclick='DoNodes(this,\"menu\")'><img src='/Images/{1}.gif' alt=''/></a>", menuId, (isExpand ? "open-menu" : "close-menu"));
}
else
{
treeHtml.Append("<img src='/Images/open-menuno.gif' alt=''/>");
}
treeHtml.Append("</td>");
}
else
{
treeHtml.Append("<td style='width: 20px;'> </td>");
}
}
string url = GetAttributesValue(node.Attributes["Url"]); //链接地址
string title = GetAttributesValue(node.Attributes["Title"]);//链接TITLE信息
string menuNodeId = nodeId.Trim().Length > 0 ? "id='MenuNode" + nodeId + "'" : string.Empty;//树节点ID
treeHtml.Append("<td style='white-space: nowrap;'>");
if (url.Length > 0 || chlidNodesCount == 0)
{
if (!isOnlyVip || (isOnlyVip && IsVip))//栏目是否只为VIP开放
{
if (url.Length > 0)
{
treeHtml.AppendFormat("<a href='{0}' target='MainFrame' title='{1}' {3} {4}>{2}</a>", url, title, showName, eventScript, menuNodeId);
}
else
{
treeHtml.AppendFormat("<a href='javascript:;' target='MainFrame' title='{0}' {2} {3}>{1}</a>", title, showName, eventScript, menuNodeId);
}
}
else
{
treeHtml.AppendFormat("<a href='javascript:;' target='MainFrame' title='{1}' onclick='return AlertVip();' class='disableColor' {3}>{2}</a>", url, title, showName, menuNodeId);
}
}
else
{
treeHtml.AppendFormat("<a href='javascript:;' onclick='DoAClick(\"Menu{0}\");' title='{1}' {3} {4}>{2}</a>", menuId, title, showName, eventScript, menuNodeId);
}
treeHtml.Append("</td>");
treeHtml.Append("</tr>");
treeHtml.Append("</table>");
}
if (chlidNodesCount > 0)
{
treeNodeHtml = CreateTreeHtml(node, deep + 1);
}
if (treeNodeHtml.Length > 0)
{
treeHtml.AppendFormat("<div id='Menu{0}Nodes' {1} style='{2}'>", menuId, (nodeType == "Module" ? "class='Menus'" : "class='MenuNodes'"), (isExpand ? "display:block;" : "display: none;"));
treeHtml.Append(treeNodeHtml);
treeHtml.Append("</div>");
}
}
return treeHtml.ToString();
}
/// <summary>
/// 取得栏目的ID
/// </summary>
private string GetMenuId(string nodeId)
{
return nodeId.Length > 0 ? nodeId : Convert.ToString(++index);
}
/// <summary>
/// 取得节点值
/// </summary>
private string GetAttributesValue(XmlAttribute attributeValue)
{
return attributeValue == null ? "" : attributeValue.Value.Trim();
}
/// <summary>
/// 是否有权限
/// </summary>
private bool GetIsPermissions(string permissions)
{
if (HavePermissions.Count == 0)
{
return false;
}
if (permissions.Length == 0)
{
return true;
}
else
{
string[] arrPermissions = permissions.Split(',');
for (int i = 0; i < arrPermissions.Length; i++)
{
if (HavePermissions.Contains(arrPermissions[i].Trim()))
{
return true;
}
}
return false;
}
}
}

相关JS代码:
复制代码 代码如下:

function DoNodes(obj,type)
{
var divId=obj.id+'Nodes';
var qdivObj=$("#"+divId);
if(qdivObj.is(":hidden"))
{
qdivObj.show();
if(type=='menu')
{
$(obj).children("img").attr("src","Images/open-menu.gif");
}
else
{
qdivObj.siblings(".Menus:visible").hide();
}
}
else
{
qdivObj.hide();
if(type=='menu')
{
$(obj).children("img").attr("src","Images/close-menu.gif");
}
}
}
function DoAClick(id)
{
$("#"+id).click();
}
function AlertVip()
{
alert("非常抱歉,此模块只对VIP会员开放!");return false;
}

最后效果
树
此代码我觉得易放便扩展,只要稍改动一下代码就能使用在自己的项目中。