ABP入門系列(14)——應用BootstrapTable表格插件

ABP入門系列目錄——學習Abp框架之實操演練
源碼路徑:Github-LearningMpaAbp


1. 引言

之前的文章ABP入門系列(7)——分頁實現(xiàn)講解了如何進行分頁展示笋籽,但其分頁展示僅適用于前臺web分頁九杂,在后臺管理系統(tǒng)中并不適用。后臺管理系統(tǒng)中的數據展示一般都是使用一些表格插件來完成的嚷狞。這一節(jié)我們就使用BootstrapTable進行舉例說明雄驹。

最終效果圖

2. BootstrapTable

基于 Bootstrap 的 jQuery 表格插件佃牛,通過簡單的設置,就可以擁有強大的單選医舆、多選俘侠、排序象缀、分頁,以及編輯爷速、導出央星、過濾(擴展)等等的功能。

Bootstrap table是一個開源的輕量級功能非常豐富的前端表格插件遍希。從命名來看就知道該表格樣式由Bootstrap接手了等曼,我們就不必糾結于樣式的調整了里烦。想對其有詳細了解凿蒜,可參考官方文檔

廢話不多說胁黑,下面我們就直接上手演練废封。

3. 實操演練

因為使用BootstrapTable進行分頁,主要的難點在插件的配置上丧蘸,所以這一次我們直接對主要代碼進行講解漂洋,源碼請自行前往Github上查看。

3.1. 添加BackendTasksController控制器

控制器中主要定義了列表力喷、創(chuàng)建刽漂、編輯相關Action。其中最重要的方法是進行數據綁定的Aciton GetAllTasks弟孟,代碼如下:

[DontWrapResult] 
public JsonResult GetAllTasks(int limit, int offset, string sortfiled, string sortway, string search, string status) {
    var sort = !string.IsNullOrEmpty(sortfiled) ? string.Format("{0} {1}", sortfiled, sortway) : "";
    TaskState currentState;
    if (!string.IsNullOrEmpty(status)) Enum.TryParse(status, true, out currentState);

    var filter = new GetTasksInput {
        SkipCount = offset,
        MaxResultCount = limit,
        Sorting = sort,
        Filter = search
    };

    if (!string.IsNullOrEmpty(status)) if (Enum.TryParse(status, true, out currentState)) filter.State = currentState;

    var pagedTasks = _taskAppService.GetPagedTasks(filter);

    return Json(new {
        total = pagedTasks.TotalCount,
        rows = pagedTasks.Items
    },
    JsonRequestBehavior.AllowGet);
}

下面來一一講解下參數:

  • limit:分頁參數贝咙,指定每頁最多顯示多少行;
  • offset:分頁參數拂募,指定偏移量庭猩;
  • sortField:排序參數,排序字段陈症;
  • sortWay:排序參數蔼水,排序方式(升序or降序);
  • search:過濾參數录肯,指定過濾的任務名稱趴腋;
  • status:過濾參數,指定過濾的任務狀態(tài)

這里面要注意的是參數的命名和順序必須和前端傳參保持一致
細心的你可能發(fā)現(xiàn)Action使用了[DontWrapResult]特性進行修飾论咏,這樣返回的json結果就不會被Abp提供的AbpJsonResult包裹于样,了解AbpJsonResult可參考ABP入門系列(8)——Json格式化

3.2. 添加List.cshtml進行列表展示

List.cshtml中主要的代碼為:

@using Abp.Web.Mvc.Extensions
@{
    ViewBag.Title = L("BackendTaskList");
    ViewBag.ActiveMenu = "BackendTaskList"; //Matches with the menu name in SimpleTaskAppNavigationProvider to highlight the menu item
}

<!-- 加載bootstrap-tablel的樣式 -->
<link rel="stylesheet" >
@section scripts{
    @Html.IncludeScript("~/Views/backendtasks/list.js");
    <!-- 加載bootstrap-tablel的script腳本 -->
    <script src="http://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.11.0/bootstrap-table.min.js"></script>

    <!-- Latest compiled and minified Locales -->
    <script src="http://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.11.0/locale/bootstrap-table-zh-CN.min.js"></script>
}

<div class="row">
    <div class="panel-body">
        <!-- 過濾框 -->
        <div class="panel panel-default">
            <div class="panel-heading">查詢條件</div>
            <div class="panel-body">
                <form id="formSearch" class="form-horizontal">
                    <div class="form-group" style="margin-top: 15px">
                        <label class="control-label col-sm-1" for="txt-filter">任務名稱</label>
                        <div class="col-sm-3">
                            <input type="text" class="form-control" id="txt-filter">
                        </div>

                        <label class="control-label col-sm-1" for="txt-search-status">狀態(tài)</label>
                        <div class="col-sm-3">
                            @Html.DropDownList("TaskStateDropdownList", null, new {id = "txt-search-status", @class = "form-control "})
                        </div>
                        <div class="col-sm-4" style="text-align: left;">
                            <button type="button" style="margin-left: 50px" id="btn-query" class="btn btn-primary">查詢</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <!-- bootstrap-tablel指定的工具欄 -->
    <div id="toolbar" class="btn-group">
        <button id="btn-add" type="button" class="btn btn-primary">
            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增
        </button>
        <button id="btn-edit" type="button" class="btn btn-success">
            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>修改
        </button>
        <button id="btn-delete" type="button" class="btn btn-danger">
            <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>刪除
        </button>
    </div>

    <!--bootstrap-table表體-->
    <table id="tb-tasks"></table>
</div>

<!--通過初始加載頁面的時候提前將創(chuàng)建任務模態(tài)框加載進來-->
@Html.Partial("_CreateTask")

<!--編輯任務模態(tài)框通過ajax動態(tài)填充到此div中-->
<div id="edit">
</div>

由于是demo性質潘靖,我直接使用的CDN來加載bootstrap table相關的css穿剖,js。
其中首先定義了過濾框卦溢,然后定義了bootstrap table專用的工具欄糊余,其會在后續(xù)bootstrap table初始化指定秀又。
接著使用<table id="tb-tasks"></table>來定義bootstrap-table表體。

3.3. 添加list.js初始化bootstrap table

初始化就是為bootstrap table指定數據來源進行數據綁定贬芥、列名定義吐辙、排序字段、分頁蘸劈,事件綁定等昏苏。
我們新建一個list.js來進行初始化:

$(function() {

    //1.初始化Table
    var oTable = new TableInit();
    oTable.Init();

    //2.初始化Button的點擊事件
    var oButtonInit = new ButtonInit();
    oButtonInit.Init();

});

var taskService = abp.services.app.task;
var $table = $('#tb-tasks');
var TableInit = function() {
    var oTableInit = new Object();
    //初始化Table
    oTableInit.Init = function() {
        $table.bootstrapTable({
            url: '/BackendTasks/GetAllTasks', //請求后臺的URL(*)
            method: 'get', //請求方式(*)
            toolbar: '#toolbar', //工具按鈕用哪個容器
            striped: true, //是否顯示行間隔色
            cache: false, //是否使用緩存,默認為true威沫,所以一般情況下需要設置一下這個屬性(*)
            pagination: true, //是否顯示分頁(*)
            sortable: true, //是否啟用排序
            sortOrder: "asc", //排序方式
            queryParams: oTableInit.queryParams, //傳遞參數(*)
            sidePagination: "server", //分頁方式:client客戶端分頁贤惯,server服務端分頁(*)
            pageNumber: 1, //初始化加載第一頁,默認第一頁
            pageSize: 5, //每頁的記錄行數(*)
            pageList: [10, 25, 50, 100], //可供選擇的每頁的行數(*)
            search: false, //是否顯示表格搜索棒掠,此搜索是客戶端搜索孵构,不會進服務端,所以烟很,個人感覺意義不大
            strictSearch: true,
            showColumns: true, //是否顯示所有的列
            showRefresh: true, //是否顯示刷新按鈕
            minimumCountColumns: 2, //最少允許的列數
            clickToSelect: true, //是否啟用點擊選中行
            height: 500, //行高颈墅,如果沒有設置height屬性,表格自動根據記錄條數覺得表格高度
            uniqueId: "Id", //每一行的唯一標識雾袱,一般為主鍵列
            showToggle: true, //是否顯示詳細視圖和列表視圖的切換按鈕
            cardView: false, //是否顯示詳細視圖
            detailView: false, //是否顯示父子表
            columns: [
                {
                    radio: true
                }, {
                    field: 'Title',
                    title: '任務名稱',
                    sortable: true
                }, {
                    field: 'Description',
                    title: '任務描述'
                }, {
                    field: 'AssignedPersonName',
                    title: '任務分配'
                }, {
                    field: 'State',
                    title: '任務狀態(tài)',
                    formatter: showState
                }, {
                    field: 'CreationTime',
                    title: '創(chuàng)建日期',
                    formatter: showDate
                }, {
                    field: 'operate',
                    title: '操作',
                    align: 'center',
                    valign: 'middle',
                    clickToSelect: false,
                    formatter: operateFormatter,
                    events: operateEvents
                }
            ]
        });
    };

這段JS中bootstrap table初始化配置的參數說明已經在代碼中進行了注釋恤筛。
下面對幾個重要的參數進行講解:

3.3.1. queryParams查詢參數

初始化的時候我們指定了查詢參數為:
queryParams: oTableInit.queryParams, //傳遞參數(*)
其中queryParams函數定義如下:

//指定bootstrap-table查詢參數
oTableInit.queryParams = function(params) {
    var temp = { //這里的鍵的名字和控制器的變量名必須一直,這邊改動芹橡,控制器也需要改成一樣的
        limit: params.limit,
        //頁面大小
        offset: params.offset,
        //頁碼
        sortfiled: params.sort,
        //排序字段
        sortway: params.order,
        //升序降序
        search: $("#txt-filter").val(),
        //自定義傳參-任務名稱
        status: $("#txt-search-status").val() //自定義傳參-任務狀態(tài)
    };
    return temp;
};

和控制器中的Action的函數命名進行比較public JsonResult GetAllTasks(int limit, int offset, string sortfiled, string sortway, string search, string status)毒坛,其中參數命名的大小寫以及順序與js中定義的查詢參數保持一致,這也是必須要注意的一點僻族。

3.3.2. 數據綁定

數據綁定包括以下三個部分:

  • url:就是用來指定請求后臺的URL粘驰;
  • uniqueid:用來綁定每一行的唯一標識列,一般為主鍵列
  • columns:用來綁定每一列要顯示的數據述么。

針對columns參數蝌数,其中field必須與你請求返回的json數據的key大小寫保持一致;
title就是顯示的列名度秘;
align指定列的水平對其方式顶伞;
valign指定列的垂直對齊方式;
formatter用來指定列如何進行格式化輸出剑梳,如操作列中指定formatter: operateFormatter,用來顯示統(tǒng)一格式的操作組唆貌;

//指定操作組
    function operateFormatter(value, row, index) {
        return [
            '<a class="like" href="javascript:void(0)" title="Like">',
            '<i class="glyphicon glyphicon-heart"></i>',
            '</a>',
            ' <a class="edit" href="javascript:void(0)" title="Edit">',
            '<i class="glyphicon glyphicon-edit"></i>',
            '</a>',
            ' <a class="remove" href="javascript:void(0)" title="Remove">',
            '<i class="glyphicon glyphicon-remove"></i>',
            '</a>'
        ].join('');
    }

events用來指定列的事件,比如操作列中指定events: operateEvents來指定每個操作對應的事件處理:

    //指定table表體操作事件
    window.operateEvents = {
        'click .like': function(e, value, row, index) {
            alert('You click like icon, row: ' + JSON.stringify(row));
            console.log(value, row, index);
        },
        'click .edit': function(e, value, row, index) {
            editTask(row.Id);
        },
        'click .remove': function(e, value, row, index) {
            deleteTask(row.Id);
        }
    };

3.3.3. 工具欄事件綁定

工具欄是我們在List.cshtml定義的新增垢乙、編輯锨咙、刪除三個按鈕,表格初始化時追逮,直接為toolbar參數指定工具欄對應的id即可酪刀,如本例toolba: '#toolbar'粹舵。那工具欄按鈕的事件在哪綁定呢?直接上代碼吧:

//bootstrap-table工具欄按鈕事件初始化
var ButtonInit = function() {
    var oInit = new Object();
    var postdata = {};

    oInit.Init = function() {
        //初始化頁面上面的按鈕事件
        $("#btn-add")
            .click(function() {
                $("#add").modal("show");
            });

        $("#btn-edit")
            .click(function() {
                var selectedRaido = $table.bootstrapTable('getSelections');
                if (selectedRaido.length === 0) {
                    abp.notify.warn("請先選擇要編輯的行骂倘!");
                } else {
                    editTask(selectedRaido[0].Id);
                }
            });

        $("#btn-delete")
            .click(function() {
                var selectedRaido = $table.bootstrapTable('getSelections');
                if (selectedRaido.length === 0) {
                    abp.notify.warn("請先選擇要刪除的行眼滤!");
                } else {
                    deleteTask(selectedRaido[0].Id);
                }
            });

        $("#btn-query")
            .click(function() {
                $table.bootstrapTable('refresh');
            });
    };
    return oInit;
};

該方法會在頁面加載初被調用:
var oButtonInit = new ButtonInit(); oButtonInit.Init();

另外函數中使用了bootstrap table預置的2個比較實用的函數:

  • $table.bootstrapTable('getSelections'):獲取表格選擇項
  • $table.bootstrapTable('refresh'):刷新表格

4. 總結

本文主要講解了如何使用bootstrap table進行后臺分頁的一般用法,講解了bootstrap table參數的配置和幾個注意事項历涝。其中有很多功能并未講到诅需,具體請自行查詢文檔。
前端的插件用法荧库,看似復雜堰塌,實則動手操作也還ok,所以重在動手實踐电爹。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蔫仙,一起剝皮案震驚了整個濱河市料睛,隨后出現(xiàn)的幾起案子丐箩,更是在濱河造成了極大的恐慌,老刑警劉巖恤煞,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屎勘,死亡現(xiàn)場離奇詭異,居然都是意外死亡居扒,警方通過查閱死者的電腦和手機概漱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喜喂,“玉大人瓤摧,你說我怎么就攤上這事∮裼酰” “怎么了照弥?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長进副。 經常有香客問我这揣,道長,這世上最難降的妖魔是什么影斑? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任给赞,我火速辦了婚禮,結果婚禮上矫户,老公的妹妹穿的比我還像新娘片迅。我一直安慰自己,他們只是感情好皆辽,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布柑蛇。 她就那樣靜靜地躺著罐旗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唯蝶。 梳的紋絲不亂的頭發(fā)上九秀,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音粘我,去河邊找鬼鼓蜒。 笑死,一個胖子當著我的面吹牛征字,可吹牛的內容都是我干的都弹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匙姜,長吁一口氣:“原來是場噩夢啊……” “哼畅厢!你這毒婦竟也來了?” 一聲冷哼從身側響起氮昧,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤框杜,失蹤者是張志新(化名)和其女友劉穎孟辑,沒想到半個月后缰趋,有當地人在樹林里發(fā)現(xiàn)了一具尸體算谈,經...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡丸氛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年衔憨,在試婚紗的時候發(fā)現(xiàn)自己被綠了奋献。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片站超。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡企锌,死狀恐怖寸癌,靈堂內的尸體忽然破棺而出专筷,到底是詐尸還是另有隱情,我是刑警寧澤蒸苇,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布磷蛹,位于F島的核電站,受9級特大地震影響填渠,放射性物質發(fā)生泄漏弦聂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一氛什、第九天 我趴在偏房一處隱蔽的房頂上張望莺葫。 院中可真熱鬧,春花似錦枪眉、人聲如沸捺檬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堡纬。三九已至聂受,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烤镐,已是汗流浹背蛋济。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炮叶,地道東北人碗旅。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像镜悉,于是被迫代替她去往敵國和親祟辟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內容