ABP框架 ---動態選單的生成
阿新 • • 發佈:2018-12-22
ABP框架 —動態選單的生成
abp框架為使用者提供了一套導航欄選單的顯示,直接使用就可以。
靜態顯示:
假設我們有一個這樣的主選單:
- Home
- Role
- User
- Add
- Edit
由上可知,Administration選單項有兩個子選單項。對應的生成方法如下:
public class TestNavigationProvider : NavigationProvider { public override void SetNavigation(INavigationProviderContext context) { context.Manager.MainMenu .AddItem( new MenuItemDefinition( "Home", new LocalizableString("Home", "Test"), url: "/Home", icon: "fa fa-tasks" ) ).AddItem( new MenuItemDefinition( "Role", new LocalizableString("Role", "Test"), url: "/Role", icon: "fa fa-bar-chart" ) ).AddItem( new MenuItemDefinition( "User", new LocalizableString("User", "Test"), icon: "fa fa-cogs" ).AddItem( new MenuItemDefinition( "Add", new LocalizableString("Add", "Test"), url: "/User/Add", icon: "fa fa-users" ) ).AddItem( new MenuItemDefinition( "Edit", new LocalizableString("Edit", "Test"), url: "/User/Edit", icon: "fa fa-star" ) ) ); } }
MenuItemDefinition可以有一個唯一的名字,一個用於本地化顯示的名字,一個url和一個icon,此外:
- requiredPermissionName 屬性可以用來判斷使用者是否有該選單的許可權
- featureDependency 屬性為選單依賴性
- 還可以定義 customData 和 order
InavigationProviderContext方法能夠獲取現有的選單項、新增選單或選單項。因此,不同的模組可以新增各自的選單。
在應用程式中可能有一個或者多個選單,context.Manager.MainMenu 是預設主選單的引用。我們可以使用 context.Manager.Menus 屬性建立和新增更多的選單。
註冊導航提供器
建立完成導航後,我們應該在ABP的 PreInitialize 配置它:
Configuration.Navigation.Providers.Add();
顯示選單
IUserNavigationManager 可以注入、獲取和顯示選單。因此,我們可以在伺服器端建立選單。
Abp自動生成的 javascript API 使得使用者能夠在客戶端獲取選單,對應的方法和物件在名稱空間 abp.nav 中。例如,在客戶端使用 abp.nav.menus.MainMenu 可以用來獲取主選單。所以我們可以在客戶端建立選單。
動態選單
參照上面靜態選單的用例,我們可以完成動態選單的顯示
public ReadOnly IRespority<EyMenu> _MenuRespority ; //EyMenu 為選單實體
public TestNavigationProvider ( IRespority<EyMenu> MenuRespority)
{
_MenuRespority = MenuRespority;
}
public class TestNavigationProvider : NavigationProvider
{
public override void SetNavigation(INavigationProviderContext context)
{
var ParentMenu = _MenuRespority.GetAll(g=>g.ParentId = 0); //獲取第一級選單
ParentMenu.ForEach(g=>{
context.Manager.MainMenu.AddItem(GetChildMenu(g)); //將獲取到的所有選單加入到選單欄中
});
}
}
private class GetChildMenu(MenuItemDefinition ParentMenu)
{
var childMenu = _MenuRespority.GetAll(g=>g.ParentId = (int)ParentMenu.customData); //獲取下一級子選單
childMenu.ForEach(g=>{
MenuItemDefinition subMenu = CreateMenuItem(g);
ParentMenu.AddItem(g); //將子選單加入到父選單的Items中
GetChildMenu(g); //繼續尋找下一級子選單
});
}
private MenuItemDefinition CreateMenuItem(EyMenu menu)
{
//建立選單
return new MenuItemDefinition{
menu.name,
new LocalizableString(menu.name, "Test"),
url:menu.url,
icon:menu.icon,
customData :menu.id
}
}
後臺通過遞迴不斷去資料庫尋找選單並將其加入到選單欄中,前臺介面只需直接使用 abp.nav.menus.MainMenu的資料,不需要再次遞迴建立