首先,创建数据库表的代码如下: 无限级树的数据库表代码 复制代码 代码如下: if exists (select * from dbo.sysobjects where id = object_id(N"[dbo].[work_sysmenu]") and OBJECTPROPERTY(id, N"IsUserTable") = 1) drop table [dbo].[work_sysmenu] GO CREATE TABLE [dbo].[work_sysmenu] ( [flowid] [int] IDENTITY (1, 1) NOT NULL , [menu_title] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [menu_value] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [menu_url] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL , [menu_parent] [int] NULL , [menu_role] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL , [menu_meno] [text] COLLATE Chinese_PRC_CI_AS NULL , [isvalid] [int] NULL , [menu_order] [int] NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
其中,menu_parent为菜单的级别代码,最顶级为0,其他级别代码为上级菜单的flowid。 ASP.NET中使用导航中的Menu控件作为菜单。 首先需要将级别为0的顶级菜单添加到Menu中,代码如下: 复制代码 代码如下: /// <summary> /// 根据用户权限获取系统菜单 /// </summary> private void GetSysMenu() { string str = "select * from work_sysmenu where dbo.GetCharCount(menu_role,"" + this.roleid +"")=1 and isvalid=1 order by menu_order"; DataSet ds= sysSqlRunner.getDataset(str); DataRow[] drRoot = ds.Tables[0].Select("menu_parent=0"); //循环生成父菜单 foreach (DataRow dr in drRoot) { MenuItem mi = new MenuItem(); mi.Text = dr["menu_title"].ToString(); mi.Value = dr["menu_value"].ToString(); //mi.NavigateUrl = dr["menu_url"].ToString(); mi.Selectable = false; mainMenu.Items.Add(mi); //递归算法生成所有级别的下级子菜单 CreateMenu(ds.Tables[0], dr["flowid"].ToString(), mi); } }
上面的代码中的sysSqlRunner.getDataset是我自用的一个数据持久层框架内的方法,用来执行一段SQL并返回Dataset,这个可以根据自己的需要来使用不同的方法。另外有一条SQL语句中包含一个我自己写的自定义函数dbo.GetCharCount,作用是获取一个字符串中,某个字符存在的个数。 复制代码 代码如下: Create function GetCharCount(@target varchar(100),@sear varchar(1)) returns int as begin declare @charcount int select @charcount=(len(@target)-len(replace(@target,@sear,""))) return @charcount end