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

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-02-27   浏览: 46 ::
收藏到网摘: 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;
}

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