以前做菜单都是取出数据后直接用菜单节点构建菜单,今天发现原来可以换为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;
}