生成无限级别菜单是一个常见的需求,而使用ASP.NET(C#)实现无限级别菜单可以通过递归来解决。以下是实现过程的详细攻略:
创建数据库表
首先,需要在数据库中保存菜单数据,可以通过如下的SQL语句来创建一个menu数据表:
CREATE TABLE [dbo].[menu](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[url] [varchar](200) NULL,
[parent_id] [int] NULL,
CONSTRAINT [PK_menu] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
添加数据
然后,向menu表中添加一些示例数据,例如:
insert [dbo].[menu] values('菜单一','/Menu1',0)
insert [dbo].[menu] values('子菜单一','/Menu1/Menu11',1)
insert [dbo].[menu] values('子菜单二','/Menu1/Menu12',1)
insert [dbo].[menu] values('子菜单三','/Menu1/Menu13',1)
insert [dbo].[menu] values('菜单二','/Menu2',0)
insert [dbo].[menu] values('子菜单四','/Menu2/Menu21',5);
insert [dbo].[menu] values('子菜单五','/Menu2/Menu22',5)
数据库连接
在C#中,要使用ADO.NET来连接数据库,使用代码如下:
using System.Data.SqlClient;
using System.Configuration;
string connectionString = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(connectionString);
创建菜单类
可以通过创建一个Menu类来存储菜单信息,如下所示:
public class Menu {
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public int ParentId { get; set; }
public List<Menu> Children { get; set; }
}
递归获取数据
使用下面的代码来从数据库中获取菜单数据:
public List<Menu> GetAllMenus() {
List<Menu> menus = new List<Menu>();
string query = "SELECT id, name, url, parent_id FROM menu";
SqlDataReader reader;
using (SqlCommand cmd = new SqlCommand(query, conn)) {
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read()) {
Menu menu = new Menu {
Id = Convert.ToInt32(reader["id"]),
Name = reader["name"].ToString(),
Url = reader["url"].ToString(),
ParentId = Convert.ToInt32(reader["parent_id"])
};
menus.Add(menu);
}
reader.Close();
conn.Close();
}
return menus;
}
递归生成菜单
使用如下的代码来递归生成菜单:
public void CreateMenu(List<Menu> menus, int parentId, ref Panel panel) {
foreach (Menu menu in menus.Where(x => x.ParentId == parentId)) {
HyperLink link = new HyperLink();
link.Text = menu.Name;
link.NavigateUrl = menu.Url;
panel.Controls.Add(link);
if (menus.Any(x => x.ParentId == menu.Id)) {
Panel subMenu = new Panel();
subMenu.CssClass = "sub-menu";
panel.Controls.Add(subMenu);
CreateMenu(menus, menu.Id, ref subMenu);
}
}
}
然后在aspx页面中使用以下的代码控件来显示菜单:
<asp:Panel ID="MainMenu" runat="server"></asp:Panel>
在页面加载时,调用以下代码即可生成无限级别菜单:
protected void Page_Load(object sender, EventArgs e) {
List<Menu> menus = GetAllMenus();
CreateMenu(menus, 0, ref MainMenu);
}
例如,以上数据添加到数据库后,会生成以下的两个菜单:
菜单一
- 子菜单一
- 子菜单二
- 子菜单三
菜单二
- 子菜单四
- 子菜单五
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net(C#)生成无限级别菜单 - Python技术站