基于Metronic的Bootstrap開發(fā)框架經(jīng)驗(yàn)總結(jié)(11)--頁面菜單的幾種呈現(xiàn)方式

在常規(guī)的后臺管理系統(tǒng)或者前端界面中伸眶,一般都有一個導(dǎo)航菜單提供給用戶,方便選擇所需的內(nèi)容刽宪±逶簦基于Metronic的Bootstrap開發(fā)框架,是整合了Metroinc樣式圣拄,以及Boostrap組件模塊的內(nèi)容嘴秸,因此菜單的效果自然也是和Bootstrap一脈相承的”幼唬基于經(jīng)常使用的幾種菜單樣式岳掐,本文進(jìn)行了相關(guān)的介紹和展示。

1饭耳、菜單展示的三種方式

菜單的展示可以做成各種各樣的效果串述,本文只是針對性的介紹其中的三種,兩種左側(cè)豎放的菜單寞肖,一種是水平橫放的菜單纲酗。
樣式1:


菜單收縮后界面如下所示。

樣式2:

樣式3:
水平樣式的菜單如下所示:

2新蟆、幾種布局的組織方式

由于這幾種布局方式觅赊,它們的框架布局頁面(也就是Layout頁面)內(nèi)容有所不同,一般情況下我們可以把它分別定義為一種Layout頁面琼稻,這樣在實(shí)際使用的時候包含它即可吮螺。
我根據(jù)上面幾種樣式,分別定義了幾個不同的Layout頁面欣簇,如下所示



一般情況下,我們生成一個視圖頁面坯约,會提示我們選擇不同的視圖布局頁面的熊咽,確認(rèn)之后會在頁面頂部應(yīng)用對應(yīng)的Layout頁面。



如果我們需要動態(tài)指定頁面的布局內(nèi)容闹丐,可以在上面使用一個變量來處理横殴,如下代碼所示。
@{ Layout = **ConfigData.ViewLayoutFile**;// "~/Views/Shared/_Layout.cshtml";  ViewBag.Title = "角色信息";}

實(shí)際上,我們一般的頁面布局確定好后衫仑,就相對比較少變更的梨与,所以為了不打破這個生成頁面的布局內(nèi)容,我們可以把前面處理好的Layout1/2/3等這些復(fù)制到Layout頁面里面進(jìn)行處理即可文狱。
不過頁面里面還是需要根據(jù)不同布局頁面粥鞋,指定不同的資源的。
我們添加樣式的資源如下所示瞄崇。

//開始全局必需樣式引用
css_metronic.Include("~/Content/metronic/assets/global/plugins/font-awesome/css/font-awesome.min.css",
   "~/Content/metronic/assets/global/plugins/simple-line-icons/simple-line-icons.min.css",
   "~/Content/metronic/assets/global/plugins/bootstrap/css/bootstrap.min.css",
   "~/Content/metronic/assets/global/plugins/bootstrap-switch/css/bootstrap-switch.min.css",

  ..........................

   //主題全局樣式
   "~/Content/metronic/assets/global/css/components-rounded.css",
   "~/Content/metronic/assets/global/css/plugins.min.css",
    //主題布局樣式
   "~/Content/metronic/assets/layouts/" + Layout + "/css/layout.css",
   "~/Content/metronic/assets/layouts/" + Layout + "/css/themes/default.min.css",
   "~/Content/metronic/assets/layouts/" + Layout + "/css/custom.min.css"

   );

上面紅色的Layout是我們根據(jù)不同布局頁面獲得的一個變量呻粹,從而能夠使得不同布局頁面的樣式和腳本順利引入的。

    /// <summary>
    /// 系統(tǒng)定義的一些常用變量
    /// </summary>
    public class ConfigData
    {
        /// <summary>
        /// Web開發(fā)框架所屬的系統(tǒng)類型定義
        /// </summary>
        public const string SystemType = "WareMis";

        /// <summary>
        /// 配置視圖的樣式布局
        /// </summary>
        public static LayoutType Layout = LayoutType.Layout2;
    }

    /// <summary>
    /// 布局樣式枚舉
    /// </summary>
    public enum LayoutType
    {
        Layout,
        Layout2,
        Layout3
    }

3苏研、菜單的動態(tài)生成

為了實(shí)現(xiàn)菜單動態(tài)的生成等浊,我們需要了解這幾種方式的菜單結(jié)構(gòu),然后我們根據(jù)它們的特點(diǎn)進(jìn)行數(shù)據(jù)結(jié)構(gòu)的生成即可摹蘑。
第一第二種布局方式的菜單結(jié)構(gòu)數(shù)據(jù)是一樣的筹燕,它們的內(nèi)容如下所示。

<ul class="page-sidebar-menu page-header-fixed " data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200">
    <li class="nav-item start" id="1">
        <a href="/Home/index?tid=1" class="nav-link nav-toggle">
            <i class="icon-home"></i>
            <span class="title">首頁</span>
            <span class="selected"></span>
            <span class="arrow open"></span>
        </a>
    </li>
    @Html.Raw(@ViewBag.MenuString)
  </ul>

我們可以通過后臺生成:@Html.Raw(@ViewBag.MenuString)
然后輸出的界面里即可衅鹿。
我們來看看前兩種菜單的結(jié)構(gòu)撒踪,簡單的結(jié)構(gòu)如下所示

<li class="nav-item start" id="1">
    <a href="/Home/index?tid=1" class="nav-link nav-toggle">
        <i class="icon-home"></i>
        <span class="title">首頁</span>
        <span class="selected"></span>
        <span class="arrow open"></span>
    </a>
</li>

如果有子菜單的,那么兩級菜單的結(jié)構(gòu)如下所示塘安。

<li class="nav-item " id="3">
    <a href="javascript:;" class="nav-link nav-toggle">
        <i class="icon-rocket"></i>
        <span class="title">客戶管理</span>
        <span class="arrow"></span>
    </a>
    <ul class="sub-menu">
        <li class="nav-item " id="31">
            <a href="second?tid=3&sid=31">
                <i class="glyphicon glyphicon-th-list"></i>
                <span class="title">客戶管理</span>
            </a>
        </li>
        <li class="nav-item  " id="32">
            <a href="second?tid=3&sid=32">
                <i class="icon-basket"></i>
                <span class="badge badge-roundless badge-danger">new</span>
                <span class="title">客戶聯(lián)系人</span>
            </a>
        </li>
    </ul>
</li>

如果是三級菜單的結(jié)構(gòu)糠涛,如下所示:

<li class="nav-item active open" id="2">
    <a href="javascript:;" class="nav-link nav-toggle">
        <i class="icon-basket"></i>
        <span class="title">行業(yè)動態(tài)</span>
        <span class="selected"></span>
        <span class="arrow open"></span>
    </a>
    <ul class="sub-menu">
        <li class="nav-item  active open" id="21">
            <a href="javascript:;" class="nav-link nav-toggle">
                <i class="icon-home"></i>
                <span class="title">行業(yè)動態(tài)</span>
                <span class="arrow"></span>
                <span class="selected"></span>
            </a>
            <ul class="sub-menu">
                <li class="nav-item  active open" id="211">
                    <a href="second?tid=2&sid=21&ssid=211">
                        <i class="icon-home"></i>
                        <span class="badge badge-danger">4</span>
                        <span class="title">政策法規(guī)</span>
                    </a>
                </li>
                <li class="nav-item " id="212">
                    <a href="second?tid=2&sid=21&ssid=212">
                        <i class="icon-basket"></i>
                        <span class="badge badge-warning">4</span>
                        <span class="title">通知公告</span>
                    </a>
                </li>
            </ul>
        </li>
    </ul>
</li>

根據(jù)這些內(nèi)容,我們在后臺動態(tài)輸出菜單結(jié)構(gòu)即可兼犯。
例如我們在基類控制器里面忍捡,通過判斷視圖的處理,實(shí)現(xiàn)菜單內(nèi)容的輸出切黔。

/// <summary>
/// 重載視圖展示界面砸脊,方便放置一些常規(guī)的ViewBag變量。
/// 如果放在OnActionExecuting纬霞,則會導(dǎo)致任何請求都會執(zhí)行一次凌埂,從而導(dǎo)致多次執(zhí)行,降低響應(yīng)效率
/// </summary>
protected override ViewResult View(string viewName, string masterName, object model)
{
    //登錄信息統(tǒng)一設(shè)置
    if (CurrentUser != null)
    {
        ViewBag.FullName = CurrentUser.FullName;
        ViewBag.Name = CurrentUser.Name;

        //ViewBag.MenuString = GetMenuString();
        ViewBag.MenuString = GetMenuStringCache(); //使用緩存诗芜,隔一段時間更新
    }

    return base.View(viewName, masterName, model);
}

為了提高菜單的響應(yīng)處理瞳抓,避免多次遞歸耗時,我們可以把生成好的菜單內(nèi)容伏恐,放到緩存里面孩哑,通過鍵值實(shí)現(xiàn)處理。

/// <summary>
/// 使用分布式緩存實(shí)現(xiàn)菜單數(shù)據(jù)的緩存處理
/// </summary>
/// <returns></returns>
public string GetMenuStringCache()
{
    string itemValue = MemoryCacheHelper.GetCacheItem<string>("GetMenuStringCache_" + CurrentUser.ID , delegate()
        {
            return GetMenuString();
        },
        null, DateTime.Now.AddMinutes(5) //5分鐘以后過期翠桦,重新獲取
    );
    return itemValue;
}

而對于水平方向的菜單處理横蜒,和前面兩者有所不同。



如二級菜單數(shù)據(jù)展示如下所示。

<li class="menu-dropdown classic-menu-dropdown ">
    <a href="index.html" class="nav-link  ">
        <i class="icon-bar-chart"></i> Default
        <span class="arrow"></span>
    </a>
</li>
<li class="menu-dropdown classic-menu-dropdown active">
    <a href="javascript:;" class="nav-link nav-toggle ">
        <i class="icon-basket"></i> Dashboard
        <span class="arrow"></span>
    </a>
    <ul class="dropdown-menu pull-left">
        <li class=" active">
            <a href="index.html" class="nav-link  active">
                <i class="icon-bar-chart"></i>Dashboard
                <span class="arrow"></span>
            </a>
        </li>
    </ul>
</li>

三級菜單展示的數(shù)據(jù)如下所示丛晌。

<li class="menu-dropdown classic-menu-dropdown ">
    <a href="javascript:;" class="nav-link nav-toggle ">
        <i class="icon-briefcase"></i> Pages
        <span class="arrow"></span>
    </a>
    <ul class="dropdown-menu pull-left">
        <li class="dropdown-submenu ">
            <a href="javascript:;" class="nav-link nav-toggle ">
                <i class="icon-basket"></i> eCommerce
                <span class="arrow"></span>
            </a>
            <ul class="dropdown-menu">
                <li class=" ">
                    <a href="ecommerce_index.html" class="nav-link ">
                        <i class="icon-home"></i> Dashboard
                    </a>
                </li>
                <li class=" ">
                    <a href="ecommerce_orders.html" class="nav-link ">
                        <i class="icon-basket"></i> Orders
                    </a>
                </li>
            </ul>
        </li>

        <li class="dropdown-submenu">
            <a href="javascript:;" class="nav-link nav-toggle">
                <i class="icon-notebook"></i> Login
                <span class="arrow"></span>
            </a>
            <ul class="dropdown-menu pull-left">
                <li class="">
                    <a href="page_user_login_1.html" class="nav-link " target="_blank"> Login Page 1 </a>
                </li>
                <li class="">
                    <a href="page_user_login_2.html" class="nav-link " target="_blank"> Login Page 2 </a>
                </li>
            </ul>
        </li>
    </ul>
</li>

我們所需要做的就是把我們數(shù)據(jù)庫里面的菜單數(shù)據(jù)仅炊,動態(tài)構(gòu)建這種遞進(jìn)式的數(shù)據(jù)結(jié)構(gòu)即可。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澎蛛,一起剝皮案震驚了整個濱河市抚垄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓶竭,老刑警劉巖督勺,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斤贰,居然都是意外死亡智哀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門荧恍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓷叫,“玉大人,你說我怎么就攤上這事送巡∧〔ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵骗爆,是天一觀的道長次氨。 經(jīng)常有香客問我,道長摘投,這世上最難降的妖魔是什么煮寡? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮犀呼,結(jié)果婚禮上幸撕,老公的妹妹穿的比我還像新娘锥咸。我一直安慰自己租悄,他們只是感情好段审,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布淘太。 她就那樣靜靜地躺著,像睡著了一般馏锡。 火紅的嫁衣襯著肌膚如雪示括。 梳的紋絲不亂的頭發(fā)上览效,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天罪佳,我揣著相機(jī)與錄音逛漫,去河邊找鬼。 笑死菇民,一個胖子當(dāng)著我的面吹牛尽楔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播第练,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼阔馋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娇掏?” 一聲冷哼從身側(cè)響起呕寝,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婴梧,沒想到半個月后下梢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塞蹭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年孽江,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片番电。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡岗屏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漱办,到底是詐尸還是另有隱情这刷,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布娩井,位于F島的核電站暇屋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洞辣。R本人自食惡果不足惜咐刨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屋彪。 院中可真熱鬧所宰,春花似錦、人聲如沸畜挥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟹但。三九已至躯泰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間华糖,已是汗流浹背麦向。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留客叉,地道東北人诵竭。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓话告,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卵慰。 傳聞我的和親對象是個殘疾皇子沙郭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容