ABP入門系列目錄——學習Abp框架之實操演練
源碼路徑:Github-LearningMpaAbpjavascript
以前的文章ABP入門系列(7)——分頁實現講解了如何進行分頁展現,但其分頁展現僅適用於前臺web分頁,在後臺管理系統中並不適用。後臺管理系統中的數據展現通常都是使用一些表格插件來完成的。這一節咱們就使用BootstrapTable進行舉例說明。css
基於 Bootstrap 的 jQuery 表格插件,經過簡單的設置,就能夠擁有強大的單選、多選、排序、分頁,以及編輯、導出、過濾(擴展)等等的功能。html
Bootstrap table是一個開源的輕量級功能很是豐富的前端表格插件。從命名來看就知道該表格樣式由Bootstrap接手了,咱們就沒必要糾結於樣式的調整了。想對其有詳細瞭解,可參考官方文檔。前端
廢話很少說,下面咱們就直接上手演練。java
由於使用BootstrapTable進行分頁,主要的難點在插件的配置上,因此這一次咱們直接對主要代碼進行講解,源碼請自行前往Github上查看。git
控制器中主要定義了列表、建立、編輯相關Action。其中最重要的方法是進行數據綁定的Aciton GetAllTasks
,代碼以下:github
[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); }
下面來一一講解下參數:web
這裏面要注意的是參數的命名和順序必須和前端傳參保持一致
細心的你可能發現Action使用了[DontWrapResult]
特性進行修飾,這樣返回的json結果就不會被Abp提供的AbpJsonResult
包裹,瞭解AbpJsonResult
可參考ABP入門系列(8)——Json格式化。ajax
List.cshtml中主要的代碼爲:json
@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" href="http://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.11.0/bootstrap-table.min.css"> @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">狀態</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> <!--經過初始加載頁面的時候提早將建立任務模態框加載進來--> @Html.Partial("_CreateTask") <!--編輯任務模態框經過ajax動態填充到此div中--> <div id="edit"> </div>
因爲是demo性質,我直接使用的CDN來加載bootstrap table相關的css,js。
其中首先定義了過濾框,而後定義了bootstrap table專用的工具欄,其會在後續bootstrap table初始化指定。
接着使用<table id="tb-tasks"></table>
來定義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: '任務狀態', formatter: showState }, { field: 'CreationTime', title: '建立日期', formatter: showDate }, { field: 'operate', title: '操做', align: 'center', valign: 'middle', clickToSelect: false, formatter: operateFormatter, events: operateEvents } ] }); };
這段JS中bootstrap table初始化配置的參數說明已經在代碼中進行了註釋。
下面對幾個重要的參數進行講解:
初始化的時候咱們指定了查詢參數爲:
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() //自定義傳參-任務狀態 }; return temp; };
和控制器中的Action的函數命名進行比較public JsonResult GetAllTasks(int limit, int offset, string sortfiled, string sortway, string search, string status)
,其中參數命名的大小寫以及順序與js中定義的查詢參數保持一致,這也是必需要注意的一點。
數據綁定包括如下三個部分:
針對columns
參數,其中field
必須與你請求返回的json數據的key大小寫保持一致;
title
就是顯示的列名;
align
指定列的水平對其方式;
valign
指定列的垂直對齊方式;
formatter
用來指定列如何進行格式化輸出,如操做列中指定formatter: operateFormatter,
用來顯示統一格式的操做組;
//指定操做組 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); } };
工具欄是咱們在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個比較實用的函數:
本文主要講解了如何使用bootstrap table進行後臺分頁的通常用法,講解了bootstrap table參數的配置和幾個注意事項。其中有不少功能並未講到,具體請自行查詢文檔。 前端的插件用法,看似複雜,實則動手操做也還ok,因此重在動手實踐。