First:
Create a table:
--用户表
--目录参考:
--父结点1
+--孩子结点1
+---孩子结点2
+--孩子结点3
--父结点2
+--孩子结点1
+--孩子结点2
if object_id('tb_menu','U')>0
drop table tb_menu
create table tb_menu --目录表
(
id int identity(1,1)primary key, --@编号
menuowner int not null, --*目录所有者【系统管理员|教务人员|教师/辅导员|学生】
menudeep int not null, --*目录层次
menuname varchar(50) not null, --*目录名
menuparent varchar(50) , --*目录父结点,父结点为空时表明此目录为根目录
urlname varchar(50) --目录对应的链接名
)
go
then in Model layer,write codes as follows:
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.1433
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using ISS.WDC.Framework.Data;
using ISS.WDC.Framework.Data.OM;
using ISS.WDC.Framework.Data.OM.OMAttribute;
using ISS.WDC.Framework.Data.OM.Collections;
using ISS.WDC.Framework.Data.OM.Transaction;
using ISS.WDC.Project.BaseItem;
namespace EAMS.Model
{
/// <summary>
/// tb_menu 实体
/// </summary>
[Serializable()]
[DataTable("tb_menu")]
public class tb_menu : Entity
{
private int _id;
/// <summary>
/// 字段名称 id
/// </summary>
public static string M_id = "id";
private int _menuowner;
/// <summary>
/// 字段名称 menuowner
/// </summary>
public static string M_menuowner = "menuowner";
private int _menudeep;
/// <summary>
/// 字段名称 menudeep
/// </summary>
public static string M_menudeep = "menudeep";
private string _menuname;
/// <summary>
/// 字段名称 menuname
/// </summary>
public static string M_menuname = "menuname";
private string _menuparent;
/// <summary>
/// 字段名称 menuparent
/// </summary>
public static string M_menuparent = "menuparent";
/// <summary>
/// 字段名称 urlname
/// </summary>
public static string M_urlname = "urlname";
private string _urlname;
/// <summary>
/// id
/// </summary>
[DataField("id", "System.Int32", false, true, true, "Int32", "SEQ_tb_menu_PK")]
public int id
{
get
{
return this._id;
}
set
{
this._id = value;
}
}
/// <summary>
/// menuowner
/// </summary>
[DataField("menuowner", "System.Int32", false, false, false, "Int32")]
public int menuowner
{
get
{
return this._menuowner;
}
set
{
this._menuowner = value;
}
}
/// <summary>
/// menudeep
/// </summary>
[DataField("menudeep", "System.Int32", false, false, false, "Int32")]
public int menudeep
{
get
{
return this._menudeep;
}
set
{
this._menudeep = value;
}
}
/// <summary>
/// menuname
/// </summary>
[DataField("menuname", "System.String", false, false, false, "String")]
public string menuname
{
get
{
return this._menuname;
}
set
{
this._menuname = value;
}
}
/// <summary>
/// menuparent
/// </summary>
[DataField("menuparent", "System.String", false, false, false, "String")]
public string menuparent
{
get
{
return this._menuparent;
}
set
{
this._menuparent = value;
}
}
/// <summary>
/// urlname
/// </summary>
[DataField("urlname", "System.String", false, false, false, "String")]
public string urlname
{
get
{
return this._urlname;
}
set
{
this._urlname = value;
}
}
}
}
then in IDAL layer,write codes:
using System;
using System.Data;
using System.Collections.Generic;
using System.Text;
using EAMS.Model;
using System.Collections;
namespace EAMS.IDAL
{
public interface INav
{
/// <summary>
/// 显示菜单
/// </summary>
/// <param name=""></param>
/// <returns></returns>
List<Model.tb_menu> selectNavmenu(int loadtype);
}
}
and,in DataProFile layer,we override this interface:
using System;
using System.Collections.Generic;
using System.Text;
using EAMS;
using EAMS.IDAL;
using EAMS.Model;
using System.Data;
using System.Data.SqlClient;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.EnterpriseLibrary.Configuration.Design;
namespace EAMS.DataProFile
{
public class Nav : INav
{
public Nav()
{ }
Database db = DatabaseFactory.CreateDatabase("Connection String");
DataSet dst;
public List<Model.tb_menu> GetNavmenu(DataTable dt)
{
List<Model.tb_menu> menu = new List<tb_menu>();
foreach (DataRow row in dt.Rows)
{
Model.tb_menu me = new tb_menu();
me.id= Convert.ToInt32(row["id"]);
me.menudeep = Convert.ToInt32(row["menudeep"]);
me.menuname = Convert.ToString(row["menuname"]);
me.menuowner = Convert.ToInt32(row["menuowner"]);
me.menuparent = Convert.ToString(row["menuparent"]);
me.urlname=Convert.ToString(row["urlname"]);
menu.Add(me);
}
return menu;
}
#region INav 成员
List<Model.tb_menu> INav.selectNavmenu(int loadtype)
{
try
{
DbCommand dbc = db.GetStoredProcCommand("sp_selectmenu");
db.AddInParameter(dbc, "@varloadtype ", System.Data.DbType.Int32, loadtype);
dst = db.ExecuteDataSet(dbc);
return GetNavmenu(dst.Tables[0]);
}
catch (Exception ex)
{
string s = ex.Message.ToString();
throw ex;
}
}
#endregion
}
}
meanwhile,we should code stored procedures:
--显示导航菜单
if exists(select name from Sysobjects where name='sp_selectmenu' and type='P')
drop proc sp_selectmenu
go
create proc sp_selectmenu
@varloadtype int
as
select id,menuowner,menudeep,menuname,menuparent,urlname
from tb_menu
where menuowner=@varloadtype
go
then in BLL layer,we provide this method to public:
using System;
using System.Collections.Generic;
using System.Text;
using EAMS.IDAL;
using System.Web;
using EAMS.Model;
namespace EAMS.BLL
{
[Serializable]
public class NavBL
{
/// <summary>
///
/// </summary>
private static readonly INav inav = new EAMS.DataProFile.Nav();
public List<Model.tb_menu> nav(int loadtype)
{
return inav.selectNavmenu(loadtype);
}
}
}
The last, is that we call functions in BLL layer:
public void LoadMenu(int loadtype)
{
//根据登录类别,获取目录
EAMS.BLL.NavBL nb = new NavBL();
List<EAMS.Model.tb_menu> lstMenu = nb.nav(loadtype);
//根目录的集合
List<EAMS.Model.tb_menu> rootmenu = new List<EAMS.Model.tb_menu>();
string[] sourcepath ={ "SysAdmInterfaceUnique", "ManInterfaceUnique", "TeaInterfaceUnique", "StuInterfaceUnique" };
foreach (EAMS.Model.tb_menu menu in lstMenu)
{
if (menu.menudeep != 1) continue;
rootmenu.Add(menu);
TreeNode tn=new TreeNode();
tn.Text=menu.menuname;
TrvMenu.Nodes.Add(tn);
//子目录
foreach (EAMS.Model.tb_menu submenu in lstMenu)
{
if (0==submenu.menuparent.CompareTo(menu.menuname) && submenu.menudeep == 2)
{
TreeNode TnSubMenu = new TreeNode();
TnSubMenu.Text = submenu.menuname;
//设置链接URL
if (submenu.urlname.CompareTo("") != 0)
{
TnSubMenu.NavigateUrl = "~/" + sourcepath[loadtype] + "/" + submenu.urlname + ".aspx";
}
tn.ChildNodes.Add(TnSubMenu);
}
}
}
TrvMenu.DataBind();
}
So,All Done!