2012-10-25 104 views
0

我想從數據庫動態顯示菜單。但我的菜單項顯示,但是當我使用點擊菜單上,子不displaying.please告訴我哪裏是錯誤從asp數據庫動態創建菜單和子菜單.net

我的代碼是

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); 
    } 
} 
+0

你要刪除的IsPostBack的檢查,它會正常工作... –

+0

我已刪除,但仍然是相同的輸出顯示 – user1773839

+0

可以請你運行我已經粘貼的代碼答案..我已經在很多項目中實現了這個代碼..你可以試試這個.. –

回答

0

。在你的代碼中沒有錯誤是運行良好可能是有可能是你的數據,你正在添加到菜單中的錯誤。可能是「ParentMenuid」丟失或可能是錯誤的

1

我認爲當你點擊菜單項時,它會導致頁面PostBack,並且您在第一次加載頁面時正在創建菜單。因此,無法在菜單上單擊時看到菜單ems.Just在頁面加載時調用GetMenuData();方法,而不檢查IsPostBack屬性。

protected void Page_Load(object sender, EventArgs e) 
{ 
    GetMenuData(); 
} 
+0

仍然沒有填充子菜單。請告訴我爲什麼它不顯示的解決方案 – user1773839

1

創建菜單的

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> 

代碼是後代碼:

private void GenerateMenus() 
{ 
    clsMenu obj = new clsMenu(); 
    System.Data.DataSet ds = new System.Data.DataSet(); 
    String PageName = ""; 
    PageName = Path.GetFileName(Page.AppRelativeVirtualPath); 
    ds = obj.GetMenusByRole(GetRoleId(), PageName); 

    StringBuilder sb = new StringBuilder("<ul class='tabs'>"); 

    foreach (System.Data.DataRow row in ds.Tables[0].Rows) 
    { 
     sb.Append(String.Format("<li class='{0}'><a rel='{1}' href='{1}' > {2} </a> ", Convert.ToString(row["css"]), ResolveUrl(Convert.ToString(row["PagePath"])), Convert.ToString(row["MenuName"]))); 
     //sb.Append(String.Format("<li '><a rel='{0}' href='{0}' > {1} </a> ", ResolveUrl(Convert.ToString(row["PagePath"])), Convert.ToString(row["MenuName"]))); 

     System.Data.DataTable t = CCMMUtility.GetFilterDataforIntColumn("MenuID", Convert.ToString(row["MenuID"]), ds.Tables[1]); 
     if (t.Rows.Count > 0) 
     { 
      sb.Append("<ul>"); 

      for (int i = 0; i < t.Rows.Count; i++) 
      { 
       sb.Append(String.Format("<li><a href='{0}' class='dir' style='cursor: pointer;'>{1}</a></li>", ResolveUrl(Convert.ToString(t.Rows[i]["PagePath"])), Convert.ToString(t.Rows[i]["PageAliasName"]))); 
      } 

      sb.Append("</ul>"); 
     } 
     sb.Append("</li>"); 
    } 

    sb.Append("</ul>"); 


    ltMenus.Text = sb.ToString(); 

} 

它需要根據角色ID存儲過程調用菜單的動態像下面

CREATE PROCEDURE [dbo].[proc_GetMenusByRole] 
(
@RoleId int, 
@PageName varchar(100) 
) 
AS 
SET NOCOUNT ON; 
SELECT mm.MenuID, mm.MenuName,dbo.Extract_CssNameForMenuByMenuIDAndPageName(mm.MenuID, @PageName) as css 
,dbo.proc_Extract_MenuPageByRoleIDAndMenuID(@RoleId, mm.MenuID) 
as PagePath , mm.DisplayOrder FROM tblMenuMaster mm WHERE mm.MenuID IN (SELECT s.MenuID from tblSiteRolePermissions p INNER JOIN 
tblSitePages s ON p.fkSitePageId = s.pkSitePageId 
WHERE (p.fkRoleId = @RoleId and p.ViewOnly=1)) 
Union All 
select 0 as menuid ,'Change Password' as MenuName, 
case @pagename 
when 'ChangePassword.aspx' then 'active' 
else '' 
end as css,'~/User/ChangePassword.aspx' as PagePath, 10000 as Displayorder 
ORDER BY DisplayOrder  
SELECT s.MenuID, s.pkSitePageId, s.PageAliasName, s.SitePageName,s.pagepath from tblSiteRolePermissions p 
INNER JOIN tblSitePages s ON p.fkSitePageId = s.pkSitePageId WHERE (p.fkRoleId [email protected] and p.ViewOnly=1) ORDER BY s.pkSitePageId 

//新的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_Extract_MenuPageByRoleIDAndMenuID SP被用來獲取頁面名稱和路徑,

Extract_CssNameForMenuByMenuIDAndPageName SP用於設置有效類到第一個li表示第一個菜單。 合這將幫助你..... 其工作代碼..