在ASP.NET中,Menu 控件是一种非常实用的用户界面元素,它允许开发者创建层次化的菜单。本文将介绍如何创建和使用Menu 控件,并通过存储过程和XML数据源进行数据绑定。
首先,需要创建几个数据表来存储菜单数据。以下是创建这些表的步骤:
1. 创建一个名为GroupMaster的表,用于定义角色或组。此表包含以下列:
2. 创建另一个表,名为Menu,用于存储菜单项。此表包含以下列:
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页面,并在其中放置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方法。