1. 程式人生 > >ABP框架 ---動態選單的生成

ABP框架 ---動態選單的生成

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的資料,不需要再次遞迴建立