鍍金池/ 教程/ C#/ ASP.NET MVC 隨想錄(3)——使用 Bootstrap 組件
ASP.NET MVC 使用 Bootstrap 系列(4)——使用 JavaScript 插件
ASP.NET MVC 隨想錄(6)——漫談 OWIN
ASP.NET MVC 隨想錄(5)——創(chuàng)建 ASP.NET MVC Bootstrap Helpers
ASP.NET MVC 隨想錄(3)——使用 Bootstrap 組件
ASP.NET MVC 隨想錄(7)——鋒利的 KATANA
ASP.NET MVC 隨想錄(1)——開始使用 Bootstrap
ASP.NET MVC 隨想錄(8)——創(chuàng)建自定義的 Middleware 中間件
ASP.NET MVC 隨想錄(2)——使用 Bootstrap CSS 和 HTML 元素
作者簡介

ASP.NET MVC 隨想錄(3)——使用 Bootstrap 組件

Bootstrap 為我們提供了十幾種的可復用組件,包括字體圖標、下拉菜單、導航、警告框、彈出框、輸入框組等。在你的 Web Application 中使用這些組件,將為用戶提供一致和簡單易用的用戶體驗。

Bootstrap 組件本質(zhì)上是結(jié)合了各種現(xiàn)有 Bootstrap 元素以及添加了一些獨特 Class 來實現(xiàn)。Bootstrap 元素我在上一篇文章中涉及到。在這篇博客中,我將繼續(xù)探索 Bootstrap 豐富的組件以及將它結(jié)合到 ASP.NET MVC 項目中。

Bootstrap 導航條

Bootstrap 導航條作為"明星組件"之一,被使用在大多數(shù)基于 Bootstrap Framework 的網(wǎng)站上。為了更好的展示 Bootstrap 導航條,我在 ASP.NET MVC 的_Layout.cshtml 布局頁創(chuàng)建一個 fixed-top 導航條,當然它是響應(yīng)式的——在小尺寸、低分辨率的設(shè)備上打開時,它將會只展示一個按鈕并帶有 3 個子菜單,當點擊按鈕時垂直展示他們。在網(wǎng)頁上顯示如下:

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/1.png" alt="" />

在移動設(shè)備上顯示如下:

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/2.png" alt="" />

在 ASP.NET MVC默認的_Layouts.cshtml 布局頁中已經(jīng)幫我們實現(xiàn)了上述功能,打開它對其稍作修改,如下代碼片段所示:

<div class="navbar navbar-inverse navbar-fixed-top">

    <div class="container">

        <div class="navbar-header">

            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">

            <span class="icon-bar"></span>

            <span class="icon-bar"></span>

            <span class="icon-bar"></span>

            </button>

            @Html.ActionLink("Northwind Traders", "Index", "Home", null, new { @class = "navbar-brand" })

        </div>

        <div class="navbar-collapse collapse">

            @Html.Partial("_BackendMenuPartial")

            @Html.Partial("_LoginPartial")

        </div>

    </div>

</div>

其中 class為.navbar-fixed-top 可以讓導航條固定在頂部,還可包含一個 .container 或 .container-fluid 容器,從而讓導航條居中,并在兩側(cè)添加內(nèi)補(padding)

注意,我使用了 2 個局部視圖(_BackendMenuPartial 和 LoginPartial)來生成余下的導航條(使用.navbar-collapse 類在低分辨率設(shè)備中折疊),其中局部視圖邏輯是基于當前訪問的用戶是否登陸來控制是否顯示。

首先,添加如下代碼在_BackendMenuPartial 視圖中,這將會在導航條中產(chǎn)生一個搜索框:

@using (Html.BeginForm("Index", "Search", FormMethod.Post, new { @class = "navbar-form navbar-left", role = "search" }))  
{

    <div class="form-group">

        @Html.TextBox("searchquery", "", new { @id = "searchquery", @class = "form-control input-sm", placeholder = "Search" })

        @Html.Hidden("fromcontroller", @ViewContext.RouteData.Values["controller"], new { @id = "fromcontroller" })

    </div>

    <button type="submit" class="btn btn-default btn-xs">GO</button>

}

因為 Bootstrap 導航條作為整個網(wǎng)站的公共部分,要實現(xiàn)快速搜索那么必須要知道當前所處于哪個 Controller,這樣才能提高檢索效率。所以上述代碼中,增加了一個 Id 為 fromcontroller 隱藏字段,代表當前訪問的 Controller。

當點擊搜索時,發(fā)送 HTTP POST 請求到 Index Action 下。然后根據(jù)傳遞過來的 fromcontroller 來 swith 到具體的 Action 來執(zhí)行搜索,具體的搜索邏輯代碼如下:

public ActionResult Index(string searchquery, string fromcontroller)

{

    switch (fromcontroller)

    {

        case "Products":

        return RedirectToAction("SearchProductsResult", new { query = searchquery });

        case "Customers":

        return RedirectToAction("SearchCustomersResult", new { query = searchquery });

        case "Employees":

        return RedirectToAction("SearchEmployeesResult", new { query = searchquery });

    }

    return View();

}

具體搜索的 Action 如下:

public ActionResult SearchProductsResult(string query)

{

    ViewBag.SearchQuery = query;

    var results = _context.Products.Where(p => p.ProductName.Contains(query)).ToList();

    return View(results);

}

public ActionResult SearchCustomersResult(string query)

{

    ViewBag.SearchQuery = query;

    var results = _context.Customers.Where(p => p.CompanyName.Contains(query)

    || p.ContactName.Contains(query)

    || p.City.Contains(query)

    || p.Country.Contains(query)).ToList();

    return View(results);

}

public ActionResult SearchEmployeesResult(string query)

{

    ViewBag.SearchQuery = query;

    var results = _context.Employees.Where(p => p.FirstName.Contains(query)

    || p.LastName.Contains(query)

    || p.Notes.Contains(query)).ToList();

    return View(results);

}

列表組

列表組是靈活又強大的組件,不僅能用于顯示一組簡單的元素,還能結(jié)合其他元素創(chuàng)建一組復雜的定制內(nèi)容。上面的搜索為我們重定向到 Result 視圖,在此視圖中,它為我們顯示了搜索結(jié)果,為了更好的展示結(jié)果,我們可以使用列表組來顯示搜索到的產(chǎn)品,視圖中的代碼如下所示:

@model IEnumerable<bootstrap.data.models.products>

@{

    ViewBag.Title = "搜索產(chǎn)品";

}

<div class="container">

    <div class="page-header">

        <h1>產(chǎn)品結(jié)果 <small>搜索條件: "@ViewBag.SearchQuery"</small></h1>

    </div>

    <ul class="list-group">

        @foreach (var item in Model)

        {

        <a href="@Url.Action("edit","products",new={ id=@item.ProductID})class="list-group-item">@item.ProductName <span class="badge">@item.UnitsInStock</span></a>

        }

    </ul>

</div>

在上述代碼中,為無序列表 ul 的 class 設(shè)置為 list-group,并且每一個li的 class 為 list-group-item,這是一個最簡單的列表組。

徽章

徽章用來高亮條目,可以很醒目的顯示新的或者未讀的條目數(shù)量,為一個元素設(shè)置徽章僅僅只需要添加元素并設(shè)置它的 class為badge。所以,在上述代碼的基礎(chǔ)上稍作修改,添加徽章,表示庫存?zhèn)€數(shù),如下 HTML 所示:

<a href="@Url.Action("edit","products",="" new={id="@item.ProductID}) class="list-group-item">
    @item.ProductName <span class="badge">@item.UnitsInStock</span>
</a>

顯示的結(jié)果為如下截圖:

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/3.png" alt="" />

媒體對象

媒體對象組件被用來構(gòu)建垂直風格的列表比如博客的回復或者推特。在 Northwind 數(shù)據(jù)庫中包含一個字段 ReportTo 表 示Employee 向另一個 Employee Report。使用媒體對象可以直觀來表示這種關(guān)系。在視圖中的代碼如下所示:

<div class="container">

<div class="page-header">

    <h1>員工搜索結(jié)果: <small>搜索條件: "@ViewBag.SearchQuery"</small></h1>

</div>

@foreach (var item in Model)

{

    <div class="media">

        <a class="pull-left" href="@Url.Action("edit", "employees", new= { id="@item.EmployeeID" })>

           <img class="media-object" src="@Url.Content("~/Images/employees/" + @item.EmployeeID + ".png")" alt="@item.FirstName" width="64" height="64">

        </a>

        <div class="media-body">

            <h4 class="media-heading">@item.FirstName @item.LastName</h4>

            @item.Notes

            @foreach (var emp in @item.ReportingEmployees)

            {

                <div class="media">

                    <a href="#" class="pull-left">

                        <img alt="@emp.FirstName" src="@Url.Content(" ~="" images="" employees="" "="" +="" @emp.employeeid="" ".png")"="" class="media-object" width="64" height="64">

                    </a>

                    <div class="media-body">

                        <h4 class="media-heading">@emp.FirstName @emp.LastName</h4>

                        @emp.Title

                    </div>

                </div>

            }

        </div>

    </div>

}

</div>

顯示結(jié)果如下:

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/4.png" alt="" />

可以看到,媒體對象組件是由一系列 class 為 media、media-heading、media-body、media-object 的元素組合而成,其中 media-object 用來表示諸如圖片、視頻、聲音等媒體對象。

注:.pull-left 和 .pull-right 這兩個類以前也曾經(jīng)被用在了媒體組件上,但是,從 v3.3.0 版本開始,他們就不再被建議使用了。.media-left 和 .media-right 替代了他們,不同之處是,在 html 結(jié)構(gòu)中, .media-right 應(yīng)當放在 .media-body 的后面。

頁頭

當用戶訪問網(wǎng)頁時,Bootstrap 頁頭可以為用戶提供清晰的指示。Bootstrap 頁頭本質(zhì)上是一個元素被封裝在 class為page-header 的

元素中。當然你也可以利用元素來提供額外的關(guān)于頁面的信息,同時 Bootstrap 為頁頭添加了水平分隔線用于分隔頁面,如下 HTML 即為我們構(gòu)建了頁頭:

<div class="page-header">

    <h1>員工搜索結(jié)果: <small>搜索條件: "@ViewBag.SearchQuery"</small></h1>

</div>

路徑導航

路徑導航(面包屑)在 Web 設(shè)計中被用來表示用戶在帶有層次的導航結(jié)構(gòu)中當前頁面的位置。類似于 Windows 資源管理器。如下 HTML 所示:

<ol class="breadcrumb">

    <li>@Html.ActionLink("Home", "Index", "Home")</li>

    <li>@Html.ActionLink("Manage", "Index", "Manage")</li>

    <li class="active">Products</li>

</ol>

在上面 HTML 代碼中,通過指定有序列表 ol 的 class 為 breadcrumb,每一個子路徑用 li 來表示,其中通過設(shè)置li的 class 為 active 代表當前所處的位置。

各路徑間的分隔符已經(jīng)自動通過 CSS 的 :before 和 content 屬性添加了。

分頁

分頁用來分隔列表內(nèi)容,特別是顯示大量數(shù)據(jù)時通過分頁可以有效的減少服務(wù)器壓力和提高用戶體驗,如下截圖使用分頁來顯示產(chǎn)品列表:

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/5.png" alt="" />

要完成上述的分頁,需要安裝 PagedList.Mvc 程序包,在 NuGet 控制臺中安裝即可:Install-PackagePagedList.Mvc

然后修改 Action,它需要接受當然的頁碼,它是一個可空的整數(shù)類型變量,然后設(shè)置 PageSize 等于5,表示每頁顯示 5 條記錄,如下代碼所示:

public ActionResult Index(int? page)

{

    var models = _context.Products.Project().To<productviewmodel>().OrderBy(p => p.ProductName);

    int pageSize = 5;

    int pageNumber = (page ?? 1);

    return View(models.ToPagedList(pageNumber, pageSize));

}

輸入框組

輸入框組為用戶在表單輸入數(shù)據(jù)時可以提供更多的額外信息。Bootstrap 的輸入框組為我們在 Input 元素的前面或者后面添加指定 class 的塊,這些塊可以是文字或者字體圖標,如下所示:

<div class="form-group">

    <div class="col-sm-2 input-group">

        <span class="input-group-addon">

            <span class="glyphicon glyphicon-phone-alt"></span>

        </span>

        @Html.TextBox("txtPhone","1194679215",new { @class = "form-control" })

    </div>

</div>

上面的輸入框組合中,在 Textbox 的左邊放置了一個帶有字體圖標 Phone 的灰色塊,結(jié)果如下所示:

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/6.png" alt="" />

不僅可以使用字體圖標,還可以使用純文本來顯示信息,如下所示在 Textbox 右邊放置了固定的郵箱域名:

<div class="form-group">

    <div class="col-sm-4 input-group">

        @Html.TextBox("txtEmail","1194679215", new { @class = "form-control" })

        <span class="input-group-addon">@@qq.com</span>

    </div>

</div>

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/7.png" alt="" />

當然也可以在 Input 元素的兩邊同時加上塊,如下代碼所示:

<div class="form-group">

    <div class="col-sm-2 input-group">

        <span class="input-group-addon">¥</span>

            @Html.TextBox("txtMoney","100",new { @class = "form-control" })

        <span class="input-group-addon">.00</span>

    </div>

</div>

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/8.png" alt="" />

按鈕式下拉菜單

按鈕式下拉菜單顧名思義,一個按鈕可以執(zhí)行多種 action,比如既可以 Save,也可以 Save 之后再打開一個新的 Form 繼續(xù)添加記錄,如下所示:

<div class="form-group">

    <div class="col-sm-offset-2 col-sm-10">

        <div class="btn-group">

            <button type="submit" class="btn btn-primary btn-sm">Save</button>

            <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown">

                <span class="caret"></span>

                <span class="sr-only">Toggle Dropdown</span>

            </button>

            <ul class="dropdown-menu" role="menu">

                <li><a href="#" id="savenew">Save &amp; New</a></li>

                <li class="divider"></li>

                <li><a href="#" id="duplicate">Duplicate</a></li>

            </ul>

        </div>

    </div>

</div>

警告框

Bootstrap 警告組件通常被用作給用戶提供可視化的反饋,比如當用戶 Save 成功后顯示確認信息、錯誤時顯示警告信息、以及其他的提示信息。

Bootstrap 提供了 4 種不同風格的警告,如下所示:

<div class="container">

    <div class="page-header">

        <h1>Alerts </h1>

    </div>

    <ol class="breadcrumb">

        <li>@Html.ActionLink("Home", "Index", "Home")</li>

        <li>Bootstrap</li>

        <li class="active">Alerts</li>

    </ol>

    <div class="alert alert-success"><strong>Success. </strong></div>

    <div class="alert alert-info"><strong>Info.</strong></div>

    <div class="alert alert-warning"><strong>Warning!</strong></div>

    <div class="alert alert-danger"><strong>Danger!</strong></div>

</div>

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/9.png" alt="" />

可關(guān)閉的警告框可以讓用戶點擊右上角的 X 來關(guān)閉,你可以使用 alter-dismissible 類:

<div class="alert alert-warning alert-Dismissible" role="alert">

    <button type="button" class="close" data-dismiss="alert">

        <span aria-hidden="true">×</span><span class="sr-only">Close</span>

    </button>

    <strong>Alert!</strong>這是可關(guān)閉的Alter

</div>

進度條

進度條在傳統(tǒng)的桌面應(yīng)用程序比較常見,當然也可以用在 Web 上。通過這些簡單、靈活的進度條,可以為當前工作流程或動作提供實時反饋。Bootstrap 為我們提供了許多樣式的進度條。

基本進度條是一種純藍色的進度條,添加一個 class 為 sr-only 的元素在進度條中是比較好的實踐,這樣能讓屏幕更好的讀取進度條的百分比。

<div class="row">

<h4>基本進度條</h4>

<div class="progress">

    <div class="progress-bar" role="progressbar" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style="width: 80%;">

        <span class="sr-only">80%完成</span>

    </div>

</div>

</div>

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/10.png" alt="" />

上下文情景變化進度條使用與按鈕和警告框相同的類,根據(jù)不同情境展現(xiàn)相應(yīng)的效果

  • progress-bar-success
  • progress-bar-info
  • progress-bar-warning
  • progress-bar-danger

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/11.png" alt="" />

條紋動畫效果進度條,為了讓進度條更加生動,可以為其添加條紋效果,在進度條 div 中添加 class 為progress-striped。當然讓進度條看起來有動畫,可以再為其指定active的class在div上,如下所示:

<div class="progress progress-striped active">

<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%">

    <span class="sr-only">40% 完成 (success)</span>

</div>

</div>

http://wiki.jikexueyuan.com/project/think-in-asp-net-mvc/images/Chapter3/12.png" alt="" />

小結(jié)

在這篇文章中,探索了Bootstrap中豐富的組件,并將它結(jié)合到ASP.NET MVC項目中。通過實例可以發(fā)現(xiàn),這類組件本質(zhì)上是結(jié)合了各種現(xiàn)有Bootstrap元素以及添加了一些獨特Class來實現(xiàn)。