在Web应用程序中动态创建菜单

时间:2010-09-02 04:27:31

标签: asp.net

我在asp.net visual studio 2008中创建一个Web应用程序.. 在我的应用程序中,我手动创建了一个菜单控件.. 因为,菜单根据需要而变化,我希望从sql表中动态加载它。 帮助我简单的应用程序,动态加载菜单控件,我可以使用这些概念开发我的....

非常感谢你

2 个答案:

答案 0 :(得分:1)

将菜单加载到数据表中。 然后在你的ascx页面中创建一个转发器(我想你的menur是一个用户控件) 为转发器创建模板。 将数据表绑定为该转发器的数据源。 然后你去一个简单的动态菜单。

别忘了在你的控件上做一个缓存。或缓存数据表。因此,您不会在网站上每页请求时打开与数据库的连接

以下是使用转发器的一些示例:

http://articles.sitepoint.com/article/asp-net-repeater-control http://www.w3schools.com/aspnet/aspnet_repeater.asp http://www.asp101.com/articles/john/repeater/default.asp

答案 1 :(得分:0)

Download Source Code Here

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
 <title>DataBase Driven Menu</title>

</head>
<body>
 <form id="form1" runat="server">
 <div id="myslidemenu" class="jqueryslidemenu">
 <asp:Menu ID="Menu1" runat="server" StaticEnableDefaultPopOutImage="False"
 Orientation="Horizontal" StaticSubMenuIndent="10px" BackColor="#FFFBD6"
 DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em"
 ForeColor="#990000">
 <DataBindings>
 <asp:MenuItemBinding DataMember="MenuItem" NavigateUrlField="NavigateUrl" TextField="Text"
 ToolTipField="ToolTip" />
 </DataBindings>
 <DynamicHoverStyle BackColor="#990000" ForeColor="White" />
 <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
 <DynamicMenuStyle BackColor="#FFFBD6" />
 <DynamicSelectedStyle BackColor="#FFCC66" />
 <StaticHoverStyle BackColor="#990000" ForeColor="White" />
 <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
 <StaticSelectedStyle BackColor="#FFCC66" />
 </asp:Menu>

 </div>
 </form>
</body>
</html>

在文件背后的代码中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Xml;
using System.Data;

public partial class _Default : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
 {
 if (!IsPostBack)
 {
 DataSet ds = new DataSet();
 XmlDataSource xmlDataSource = new XmlDataSource();
 xmlDataSource.ID = "xmlDataSource";
 xmlDataSource.EnableCaching = false;

string connStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=G:\Admin\WebSite28\App_Data\Database.mdf;Integrated Security=True;User Instance=True";
 using (SqlConnection conn = new SqlConnection(connStr))
 {
 string sql = "Select ID, Text,NavigateUrl,ParentID from Menu";
 SqlDataAdapter da = new SqlDataAdapter(sql, conn);
 da.Fill(ds);
 da.Dispose();
 }

&nbsp;

ds.DataSetName = "Menus";
 ds.Tables[0].TableName = "Menu";
 DataRelation relation = new DataRelation("ParentChild",
 ds.Tables["Menu"].Columns["ID"],
 ds.Tables["Menu"].Columns["ParentID"],
 true);

relation.Nested = true;
 ds.Relations.Add(relation);

xmlDataSource.Data = ds.GetXml();

//Reformat the xmldatasource from the dataset to fit menu into xml format
 xmlDataSource.TransformFile = Server.MapPath("~/TransformXSLT.xsl");

//assigning the path to start read all MenuItem under MenuItems
 xmlDataSource.XPath = "MenuItems/MenuItem";

//Finally, bind the source to the Menu1 control
 Menu1.DataSource = xmlDataSource;
 Menu1.DataBind();
 }

}
}

创建和转换XSLT.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" indent="yes" encoding="utf-8"/>
 <!-- Find the root node called Menus
 and call MenuListing for its children -->
 <xsl:template match="/Menus">
 <MenuItems>
 <xsl:call-template name="MenuListing" />
 </MenuItems>
 </xsl:template>

 <!-- Allow for recusive child node processing -->
 <xsl:template name="MenuListing">
 <xsl:apply-templates select="Menu" />
 </xsl:template>

 <xsl:template match="Menu">
 <MenuItem>
 <!-- Convert Menu child elements to MenuItem attributes -->
 <xsl:attribute name="Text">
 <xsl:value-of select="Text"/>
 </xsl:attribute>
 <xsl:attribute name="ToolTip">
 <xsl:value-of select="ToolTip"/>
 </xsl:attribute>
 <xsl:attribute name="NavigateUrl">
 <xsl:value-of select="NavigateUrl"/>
 </xsl:attribute>

 <!-- Call MenuListing if there are child Menu nodes -->
 <xsl:if test="count(Menu) > 0">
 <xsl:call-template name="MenuListing" />
 </xsl:if>
 </MenuItem>
 </xsl:template>
</xsl:stylesheet>

创建Sql表

CREATE TABLE [dbo].[Menu](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [Text] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [ToolTip] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [NavigateUrl] [varchar](150) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [ParentID] [int] NULL)