以前做菜单都是取出数据后直接用菜单节点构建菜单,今天发现原来可以换为xml为数据源,做了一个简单的实验了一下,发现比直接建菜单舒服些,写出来看看
注:其中SystemMenuInfo为实体类,我就不写出来了,
看来菜单还是依赖XML结构才是正道
数据表简单结构
SystemMenuID | SystemMenuName | ParentID | Url |
1 | 黑龙江省 | 0 | # |
2 | 哈尔滨市 | 1 | # |
3 | 五常市 | 2 | # |
4 | 辽宁省 | 0 | # |
5 | 大连市 | 4 | # |
public partial class StartPage : System.Web.UI.Page
{
SystemMenu sm = new SystemMenu();
IList<SystemMenuInfo> sms;
public void RecursionXml(SystemMenuInfo smi, XmlDocument xd, XmlElement xe)
{
XmlElement menuItem = xd.CreateElement("menuItem");
menuItem.SetAttribute("SystemMenuID", smi.SystemMenuID);
menuItem.SetAttribute("SystemMenuName", smi.SystemMenuName);
menuItem.SetAttribute("ParentID", smi.ParentID);
menuItem.SetAttribute("Url", smi.Url);
xe.AppendChild(menuItem);
foreach (SystemMenuInfo smiChild in sms)
{
if (smiChild.ParentID == smi.SystemMenuID)
{
RecursionXml(smiChild, xd, menuItem);
}
}
}
public string CreateMenu()
{
sms = sm.GetSystemMenus();
XmlDocument xd = new XmlDocument();
XmlNode menu = xd.CreateElement("menu");
xd.AppendChild(menu);
foreach (SystemMenuInfo smi in sms)
{
if (smi.ParentID == "0")
{
RecursionXml(smi, xd, (XmlElement)menu);
}
}
return xd.OuterXml;
}
public void BindMenu()
{
//XmlSource.DataFile = "*.xml";当然如果你依赖与实际的xml文件也是可以的
XmlSource.Data = CreateMenu();
XmlSource.DataBind();
XmlSource.XPath = "menu/menuItem";
TreeView1.DataSource = XmlSource;
TreeView1.DataBind();
Menu2.DataSource = XmlSource;
Menu2.DataBind();
}
protected void Page_Load(object sender, EventArgs e)
{
BindMenu();
}
}
<asp:Menu ID="Menu2" runat="server" Orientation="Horizontal" StaticEnableDefaultPopOutImage="false">
<DataBindings>
<asp:MenuItemBinding ValueField="SystemMenuID" TextField="SystemMenuName" NavigateUrlField="Url" />
</DataBindings>
</asp:Menu>
<asp:XmlDataSource runat="server" ID="XmlSource" />
<asp:TreeView ID="TreeView1" runat="server">
<DataBindings>
<asp:TreeNodeBinding ValueField="SystemMenuID" TextField="SystemMenuName" NavigateUrlField="Url" />
</DataBindings>
</asp:TreeView>
然后 你就可以看效果了:)
public class SystemMenu
{
public IList<SystemMenuInfo> GetSystemMenus()
{
IList<SystemMenuInfo> ss = new List<SystemMenuInfo>();
SystemMenuInfo s1 = new SystemMenuInfo();
s1.SystemMenuID = "1";
s1.SystemMenuName = "黑龙江省";
s1.ParentID = "0";
s1.Url = "#";
SystemMenuInfo s2 = new SystemMenuInfo();
s2.SystemMenuID = "2";
s2.SystemMenuName = "哈尔滨市";
s2.ParentID = "1";
s2.Url = "#";
SystemMenuInfo s3 = new SystemMenuInfo();
s3.SystemMenuID = "3";
s3.SystemMenuName = "五常市";
s3.ParentID = "2";
s3.Url = "#";
SystemMenuInfo s4 = new SystemMenuInfo();
s4.SystemMenuID = "4";
s4.SystemMenuName = "辽宁省";
s4.ParentID = "0";
s4.Url = "#";
SystemMenuInfo s5 = new SystemMenuInfo();
s5.SystemMenuID = "5";
s5.SystemMenuName = "大连市";
s5.ParentID = "4";
s5.Url = "#";
ss.Add(s1);
ss.Add(s2);
ss.Add(s3);
ss.Add(s4);
ss.Add(s5);
return ss;
}
}
public class SystemMenuInfo
{
public string SystemMenuID;
public string SystemMenuName;
public string ParentID;
public string Url;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2008-01-08 Rational Rose和UML可视化建模基础