ASP.NET的Menu和数控件可以绑定XML文件,而且在视图状态下就可以基本完成整个编辑绑定工作,但实际情况千变万化,我遇到过一种情况,就是网站采用Forms验证,登录后台后根据权限的不同产生一个导航条。其实实现的方法很多,JS可以,但是我至今还没有找到一款Windows下适合编写JS代码的工具,每次只能凭ctrl解决问题。。而且JS的调试也是一个问题,IE很弱智,只能转到Firefox中,很是繁琐,所以一般情况下,我都采用C#绑定。
首先是Forms验证,这个不是本篇的重点,所以不作详细的说明。权限有“"System", "Ador", "Xml", "Type", "Blog", "Group", "File", "Goods", "Admin", "User"”,其中“User”是前台注册用户拥有的权限,“Admin”以及之前的权限是后台管理的权限。绑定的XML文件代码如下(Admin_Menu.XML):
<?xml version="1.0" encoding="utf-8" ?>
<menu>
<menuItem url="#" title="网站全局设置" target="_self" Role="System">
<menuItem url="Admin_Config.aspx" title="参数设置" target="Mian" Role="System"/>
<menuItem url="Admin_RePort.aspx" title="举报管理" target="Mian" Role="System"/>
</menuItem>
<menuItem url="#" title="用户及管理员" target="_self" Role="Ador">
<menuItem url="Admin_User.aspx" title="Blog用户管理" target="Mian" Role="Ador"/>
<menuItem url="Admin_AdWork.aspx" title="后台管理统计" target="Mian" Role="Ador"/>
</menuItem>
<menuItem url="#" title="Xml文件管理" target="_self" Role="Xml">
<menuItem url="Admin_Xml.aspx?Way=Auto" title="自动生成文件" target="Mian" Role="Xml"/>
<menuItem url="Admin_Xml.aspx?Way=Hand" title="手动生成文件" target="Mian" Role="Xml"/>
<menuItem url="Admin_Xml.aspx?Way=Repair" title="修复xml文件" target="Mian" Role="Xml"/>
</menuItem>
<menuItem url="#" title="Type类别设置" target="_self" Role="Type">
<menuItem url="Admin_Type.aspx?Go=Goods" title="物品栏目" target="Mian" Role="Type"/>
<menuItem url="Admin_Type.aspx?Go=File" title="上传栏目" target="Mian" Role="Type"/>
<menuItem url="Admin_Type.aspx?Go=Group" title="圈子栏目" target="Mian" Role="Type"/>
<menuItem url="Admin_BlogFClass.aspx" title="博客大类设置" target="Mian" Role="Type"/>
</menuItem>
<menuItem url="#" title="博客管理" target="_self" Role="Blog">
<menuItem url="Admin_BlogSClass.aspx" title="小类设置" target="Mian" Role="Blog"/>
<menuItem url="Admin_BlogList.aspx" title="博客文章管理" target="Mian" Role="Blog"/>
<menuItem url="Admin_BlogImage.aspx" title="博客图片管理" target="Mian" Role="Blog"/>
</menuItem>
<menuItem url="#" title="圈子管理" target="_self" Role="Group">
<menuItem url="Admin_GroupLife.aspx" title="圈子活动管理" target="Mian" Role="Group"/>
</menuItem>
<menuItem url="#" title="上传文件管理" target="Mian" Role="File">
<menuItem url="Admin_PhotoList.aspx" title="图片管理" target="Mian" Role="File"/>
<menuItem url="Admin_MediaList.aspx" title="音频管理" target="Mian" Role="File"/>
<menuItem url="Admin_VideoList.aspx" title="视频管理" target="Mian" Role="File"/>
<menuItem url="Admin_FlashList.aspx" title="Flash管理" target="Mian" Role="File"/>
<menuItem url="Admin_DocList.aspx" title="文档文件管理" target="Mian" Role="File"/>
<menuItem url="Admin_ZipList.aspx" title="压缩文件管理" target="Mian" Role="File"/>
<menuItem url="Admin_Others.aspx" title="其它文件" target="Mian" Role="File"/>
</menuItem>
<menuItem url="#" title="物品管理" target="Mian" Role="Goods">
<menuItem url="Admin_Goods.aspx" title="社区物品管理" target="Mian" Role="Goods"/>
<menuItem url="Admin_GClass.aspx" title="物品小类别" target="Mian" Role="Goods"/>
</menuItem>
</menu>
XML文件也不需太多的说明,Role节点值就是对应的权限。
在网上有些高人给出了遍历XML的代码,按照那些思路,修改一下,代码如下:
private int LinkNum = 0;
//private static int LinkNum = 0;全局继承
protected void Page_Load(object sender, EventArgs e)

{
try

{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("../XML_Total/Admin_Menu.xml"));
BuildTree(xmlDoc.ChildNodes[1].ChildNodes, TreeMenu.Nodes);
}
catch

{

}

}
private void BuildTree(XmlNodeList XmlNodes, TreeNodeCollection treeNodes)

{
for (int i = 0; i < XmlNodes.Count; i++)

{
if (XmlNodes[i].NodeType == XmlNodeType.Element)

{
TreeNode tNode = new TreeNode();
if (XmlNodes[i].Attributes.Count > 0)

{
if (User.IsInRole(XmlNodes[i].Attributes["Role"].Value))

{
if (XmlNodes[i].HasChildNodes)

{
tNode.Target = "_self";
tNode.NavigateUrl = "javascript:TreeView_ToggleNode(TreeMenu_Data," + LinkNum + ",TreeMenun" + LinkNum + ",' ',TreeMenun" + LinkNum + "Nodes)";
}
else

{
tNode.NavigateUrl = XmlNodes[i].Attributes["url"].Value;
tNode.Target = XmlNodes[i].Attributes["target"].Value;
}
tNode.Text = XmlNodes[i].Attributes["title"].Value;
LinkNum++;
treeNodes.Add(tNode);
}
}
if (XmlNodes[i].HasChildNodes)

{
BuildTree(XmlNodes[i].ChildNodes, tNode.ChildNodes);

}

}
}
}
其实就是一个遍历XML文件,根据Forms验证自带的用户权限验证,看是否与XML中“Role”值对应。