在asp.net中从数据库动态创建菜单和子菜单
我想从数据库中动态显示菜单。但我的菜单项正在显示,但当我过去单击菜单时,子菜单不显示。请告诉我错误在哪里 我的代码是在asp.net中从数据库动态创建菜单和子菜单,asp.net,master-pages,Asp.net,Master Pages,我想从数据库中动态显示菜单。但我的菜单项正在显示,但当我过去单击菜单时,子菜单不显示。请告诉我错误在哪里 我的代码是 protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { GetMenuData(); } } private void GetMenuData() { DataTable table = new DataTable(); SqlConnection conn
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{ GetMenuData(); }
}
private void GetMenuData()
{
DataTable table = new DataTable();
SqlConnection conn = new SqlConnection(@"Data Source=ST015\SQLEXPRESS;Initial Catalog=MyData;Integrated Security=True");
string sql = "select menuId,Menuname,MenuDescription,ParentMenuid,MenuUrl from Categories";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(table);
DataView view = new DataView(table);
view.RowFilter = "ParentMenuId is NULL";
foreach (DataRowView row in view)
{
MenuItem menuItem = new MenuItem(row["MenuName"].ToString(),
row["MenuId"].ToString());
menuItem.NavigateUrl = row["MenuUrl"].ToString();
Menu1.Items.Add(menuItem);
AddChildItems(table, menuItem);
}
}
private void AddChildItems(DataTable table, MenuItem menuItem)
{
DataView viewItem = new DataView(table);
viewItem.RowFilter = "ParentMenuId=" + menuItem.Value;
foreach (DataRowView childView in viewItem)
{
MenuItem childItem = new MenuItem(childView["MenuName"].ToString(),
childView["MenuId"].ToString());
childItem.NavigateUrl = childView["MenuUrl"].ToString();
menuItem.ChildItems.Add(childItem);
AddChildItems(table, childItem);
}
}
您的代码中没有错误。它工作正常。您添加到菜单中的数据可能有错误。可能是“ParentMenuid”丢失或可能有错误我想当您单击菜单项时,它导致页面
PostBack
,并且您在第一次加载页面时正在创建菜单。因此,您无法在单击菜单项时看到菜单。只需调用GetMenuData()页面加载时不检查IsPostBack
属性的code>方法
protected void Page_Load(object sender, EventArgs e)
{
GetMenuData();
}
为菜单的菜单创建一个表
CREATE TABLE [dbo].[tblMenuMaster](
[MenuID] [int] IDENTITY(1,1) NOT NULL,
[MenuName] [varchar](100) NULL,
[DisplayOrder] [int] NULL,
PRIMARY KEY CLUSTERED
(
[MenuID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
为子菜单的创建另一个表
CREATE TABLE [dbo].[tblSubMenuMaster](
[SubMenuID] [int] IDENTITY(1,1) NOT NULL,
[MenuID] [int] NULL,
[SubMenuName] [varchar](100) NULL,
[MainMenuDisplayOrder] [int] NULL,
[DisplayOrder] [int] NULL,
[SubMenuUrl] [varchar](500) NULL,
[VisibleInMenu] [bit] NULL,
PRIMARY KEY CLUSTERED
(
[SubMenuID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
现在转到母版页。。
HTML代码是:
<div class="menubar">
<%--<ul class="tabs">--%>
<asp:Literal ID="ltMenus" runat="server"></asp:Literal>
<%--</ul>--%>
</div>
//新sp从这里开始
CREATE function [dbo].[Extract_CssNameForMenuByMenuIDAndPageName](@MenuID int,
PageName varchar(100))
returns nvarchar(50)
as begin
declare @result nvarchar(50)
set @result = ''
IF EXISTS (SELECT pkSitePageId FROM tblsitepages WHERE (MenuID = @MenuID) AND (UPPER(SitePageName) = @PageName))
BEGIN
SET @result = 'active'
END
return @result
end
//使用的另一个sp是
CREATE function [dbo].[proc_Extract_MenuPageByRoleIDAndMenuID]
(@RoleId int, @MenuID int)
returns nvarchar(500)
as begin
declare @result nvarchar(500)
SELECT top 1 @result = s.pagepath FROM tblSitePages AS s INNER JOIN tblSiteRolePermissions AS p ON s.pkSitePageId = p.fkSitePageId
WHERE (p.fkRoleId = @RoleId) AND (s.MenuID = @MenuID) and p.ViewOnly=1
ORDER BY s.pkSitePageId
return @result
end
这只是一种方法,你可以根据你的要求修改
proc\u Extract\u MenuPageByRoleIDAndMenuIDsp用于获取页面名称及其路径
Extract\u cssnameformenubymenuid和pagenamesp用于将active类设置为第一个li表示第一个菜单。
这将帮助你。。。。。
这是工作代码。您必须删除isPostBack的检查,它将正常工作…我已删除,但仍显示相同的输出您可以运行我粘贴在应答中的代码吗。。我已经在许多项目中实现了这段代码。。您可以试试这个..我无法理解存储过程请正确解释我,直到子菜单未填充。请告诉我为什么它不显示的解决方案
CREATE function [dbo].[Extract_CssNameForMenuByMenuIDAndPageName](@MenuID int,
PageName varchar(100))
returns nvarchar(50)
as begin
declare @result nvarchar(50)
set @result = ''
IF EXISTS (SELECT pkSitePageId FROM tblsitepages WHERE (MenuID = @MenuID) AND (UPPER(SitePageName) = @PageName))
BEGIN
SET @result = 'active'
END
return @result
end
CREATE function [dbo].[proc_Extract_MenuPageByRoleIDAndMenuID]
(@RoleId int, @MenuID int)
returns nvarchar(500)
as begin
declare @result nvarchar(500)
SELECT top 1 @result = s.pagepath FROM tblSitePages AS s INNER JOIN tblSiteRolePermissions AS p ON s.pkSitePageId = p.fkSitePageId
WHERE (p.fkRoleId = @RoleId) AND (s.MenuID = @MenuID) and p.ViewOnly=1
ORDER BY s.pkSitePageId
return @result
end