ASP.NET Menu 控制与数据绑定

ASP.NET中,Menu 控件是一种非常实用的用户界面元素,它允许开发者创建层次化的菜单。本文将介绍如何创建和使用Menu 控件,并通过存储过程和XML数据源进行数据绑定

创建菜单数据表

首先,需要创建几个数据表来存储菜单数据。以下是创建这些表的步骤:

1. 创建一个名为GroupMaster的表,用于定义角色或组。此表包含以下列:

  • pkGroupId:作为主键。
  • GroupName:组名。
  • Description:描述信息。

2. 创建另一个表,名为Menu,用于存储菜单项。此表包含以下列:

  • pkMenuId:作为主键,定义菜单项。
  • ParentID:定义子菜单项应该出现在哪个菜单项下。
  • Title:菜单项标题。
  • URL:链接地址。
  • Description:描述信息。
  • Roles:角色。

3. 创建第三个表,名为GroupMenuDetails,用于放置上述两个表主键之间的关系,即pkGroupId和pkMenuId。此表包含一个标志位IsDisplay。

创建存储过程

接下来,需要创建一个存储过程,该过程接受角色作为输入参数,并输出XML字符串。以下是存储过程的示例代码:

CREATE PROCEDURE [dbo].[GetXMLMenus] ( @Role VARCHAR(100) ) AS BEGIN SET NOCOUNT ON; SELECT MainMenus.Title AS '@Text', Url AS '@Url', ( SELECT SubMenus.Title AS '@Text', SubMenus.Url AS '@Url' FROM ( SELECT MD.pkMenuId AS pkMenuId, MD.ParentId AS ParentID, MD.Title, MD.Description, MD.Url, GMD.pkGroupMenuId, GMD.IsDisplay FROM GroupMenuDetails AS GMD INNER JOIN Menu AS MD ON GMD.pkMenuId = MD.pkMenuId AND GMD.pkGroupId = @Role ) AS SubMenus WHERE SubMenus.ParentID = MainMenus.pkMenuID AND SubMenus.ParentID IS NOT Null ORDER BY SubMenus.pkMenuID FOR XML PATH('SubMenu'), TYPE ) AS 'Menus' FROM ( SELECT MD.pkMenuId AS pkMenuId, MD.ParentId AS ParentId, MD.Title, MD.Url, MD.Description, GMD.pkGroupMenuId, GMD.IsDisplay FROM GroupMenuDetails AS GMD INNER JOIN Menu AS MD ON GMD.pkMenuId = MD.pkMenuId AND GMD.pkGroupId = @Role AND MD.ParentId IS Null ) AS MainMenus FOR XML PATH('Menu'), ROOT('Menus') END

这个存储过程首先设置NOCOUNT ON以防止额外的结果集干扰SELECT语句。然后,它通过一个子查询来映射列到XML属性/元素,并使用FOR XML PATH和ROOT来构建XML结构。

创建ASPX页面

现在,需要创建一个ASPX页面,并在其中放置Menu控件和XmlDataSource。以下是在页面加载时调用存储过程的代码示例:

protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { populatemenu(); } } protected void populatemenu() { SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["SqlConn1"]); int Role = 1; SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "GetXMLMenus"; if ((Role != 0)) { cmd.Parameters.AddWithValue("@Role", Role); cmd.Connection = conn; SqlDataAdapter da_1 = new SqlDataAdapter(cmd); DataSet ds_1 = new DataSet(); string result = ""; Xml XmlData = new Xml(); XmlDocument XmlDocument = new XmlDocument(); try { conn.Open(); string result = Convert.ToString(cmd.ExecuteScalar()); da_1.Fill(ds_1); ds_1.DataSetName = "Menus1"; ds_1.Tables[0].TableName = "Menu1"; XmlDataSource1.Data = result; XmlDataSource1.XPath = "Menus/Menu"; Menu1.DataSourceID = "XmlDataSource1"; Menu1.DataBind(); } catch (Exception ex) { Response.Write(ex.Message); } finally { conn.Dispose(); cmd.Dispose(); da_1.Dispose(); ds_1.Dispose(); } } }

在这段代码中,首先创建了一个SQL连接,然后定义了一个角色参数。接着,创建了一个SqlCommand对象,并设置其CommandType为StoredProcedure。调用存储过程GetXMLMenus,并传入角色参数。然后,使用SqlDataAdapter填充一个DataSet,并将其绑定到XmlDataSource。最后,将XmlDataSource绑定到Menu控件,并调用DataBind方法。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485