ABP入门系列(14)——应用BootstrapTable表格插件

1. 引言

之前的文章ABP入门系列(7)——分页实现讲解了如何进行分页展示,但其分页展示仅适用于前台web分页,在后台管理系统中并不适用。后台管理系统中的数据展示一般都是使用一些表格插件来完成的。这一节我们就使用BootstrapTable进行举例说明。

最终效果图

2. BootstrapTable

基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选、多选、排序、分页,以及编辑、导出、过滤(扩展)等等的功能。

Bootstrap table是一个开源的轻量级功能非常丰富的前端表格插件。从命名来看就知道该表格样式由Bootstrap接手了,我们就不必纠结于样式的调整了。想对其有详细了解,可参考官方文档。

废话不多说,下面我们就直接上手演练。

3. 实操演练

因为使用BootstrapTable进行分页,主要的难点在插件的配置上,所以这一次我们直接对主要代码进行讲解,源码请自行前往Github上查看。

3.1. 添加BackendTasksController控制器

控制器中主要定义了列表、创建、编辑相关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:过滤参数,指定过滤的任务状态

这里面要注意的是参数的命名和顺序必须和前端传参保持一致
细心的你可能发现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" 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表体。

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

初始化就是为bootstrap table指定数据来源进行数据绑定、列名定义、排序字段、分页,事件绑定等。
我们新建一个list.js来进行初始化:

 

$(function() {//1.初始化Tablevar 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();//初始化TableoTableInit.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初始化配置的参数说明已经在代码中进行了注释。
下面对几个重要的参数进行讲解:

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() //自定义传参-任务状态};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,用来显示统一格式的操作组;

 

//指定操作组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,所以重在动手实践。



作者:圣杰
链接:https://www.jianshu.com/p/8ad141c30235
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

musictools怎么用不了_夏天少不了一只草编包,怎么搭配才不像“买菜用”?

要说有什么包包能跟夏天的气息一拍即合&#xff0c;那绝对非“草编包”莫属&#xff01;由藤条、柳条等编制而成的田园风“小篮子”&#xff0c;已经成了夏日街头小姐姐们的包包首选。各大品牌都争相推出草编包系列&#xff0c;在原有的浪漫度假风之外&#xff0c;添加了更多时…

ABP入门系列(15)——创建微信公众号模块

1. 引言 现在的互联网已不在仅仅局限于网页应用&#xff0c;IOS、Android、平板、智能家居等平台正如火如荼的迅速发展&#xff0c;移动应用的需求也空前旺盛。所有的互联网公司都不想错过这一次移动浪潮&#xff0c;布局移动市场分一份移动红利。 的确&#xff0c;智能手机作…

spark 算子例子_Spark性能调优方法

公众号后台回复关键词&#xff1a;pyspark&#xff0c;获取本项目github地址。Spark程序可以快如闪电⚡️&#xff0c;也可以慢如蜗牛?。它的性能取决于用户使用它的方式。一般来说&#xff0c;如果有可能&#xff0c;用户应当尽可能多地使用SparkSQL以取得更好的性能。主要原…

ABP入门系列(16)——通过webapi与系统进行交互

1. 引言 上一节我们讲解了如何创建微信公众号模块&#xff0c;这一节我们就继续跟进&#xff0c;来讲一讲公众号模块如何与系统进行交互。 微信公众号模块作为一个独立的web模块部署&#xff0c;要想与现有的【任务清单】进行交互&#xff0c;我们要想明白以下几个问题&#x…

python嵩天第二版第五章_如何避免从入门到放弃——python小组学习复盘

2019年春节python学习行动复盘2019-02-09为了主攻python&#xff0c;没有参加心理学晨读。对心理学也不敢兴趣&#xff0c;怕耽误学习python的时间。那么没学习心理学的情况下&#xff0c;python学的怎么样&#xff1f;是否达到自己的预期&#xff1f;一、预期目标&#xff1a;…

ABP入门系列(17)——使用ABP集成的邮件系统发送邮件

1.Abp集成的邮件模块是如何实现的 ABP中对邮件的封装主要集成在Abp.Net.Mail和Abp.Net.Mail.Smtp命名空间下&#xff0c;相应源码在此。 分析可以看出主要由以下几个核心类组成&#xff1a; EmailSettingNames&#xff1a;静态常量类&#xff0c;主要定义了发送邮件需要的相关…

cdn转发防攻击_高防CDN和高防服务器的区别?

越来越多的网络攻击需要处理&#xff0c;而高防CDN和高防服务器是很好的选择&#xff0c;那么如何选择呢&#xff1f;我们就来分析一下关于这两者之间的选择。首先从价格上看的话&#xff0c;高防御CDN的价格相对高一些&#xff0c;防御上看&#xff0c;高防御CDN的防御效果也更…

ABP入门系列(18)—— 使用领域服务

1.引言 自上次更新有一个多月了&#xff0c;发现越往下写&#xff0c;越不知如何去写。特别是当遇到DDD中一些概念术语的时候&#xff0c;尤其迷惑。如果只是简单的去介绍如何去使用ABP&#xff0c;我只需参照官方文档&#xff0c;实现到任务清单Demo中去就可以了&#xff0c;…

mysql文件类型_MyCat教程:实现MySql主从复制

原文&#xff1a;http://iii75.cn/mwQhBW 作者&#xff1a;波波烤鸭历史相关文章Mycat入门教程单个mysql数据库在处理业务的时候肯定是有限的&#xff0c;这时我们扩展数据库的第一种方式就是对数据库做读写分离(主从复制),本文我们就先来介绍下怎么来实现mysql的主从复制操作。…

截屏当前界面_电脑屏幕怎么截取,常见的几种电脑截屏方法

随着科技的快速发展电脑已经逐渐渗入到我们的工作和生活中&#xff0c;我们需要使用电脑的地方也越来越多&#xff0c;电脑已经成为了一种新式的办公工具。今天小编不是向大家介绍电脑的应用&#xff0c;而是想要和大家分享一下关于电脑截图的几种方法。1、Print Screen SysRqP…

ABP入门系列(19)——使用领域事件

1.引言 最近刚学习了下DDD中领域事件的理论知识&#xff0c;总的来说领域事件主要有两个作用&#xff0c;一是解耦&#xff0c;二是使用领域事件进行事务的拆分&#xff0c;通过引入事件存储&#xff0c;来实现数据的最终一致性。若想了解DDD中领域事件的概念&#xff0c;可参…

扩容是元素还是数组_Java中对数组的操作

数组对于每一门编程语言来说都是重要的数据结构之一&#xff0c;当然不同语言对于数组的实现及处理也不尽相同。Java语言中提供的数组是用来存储固定大小的同类型元素。如&#xff1a;声明一个数组变量&#xff0c;numbers[100]来代替直接声明100个独立变量number0,number1,...…

ABP入门系列(20)——使用后台作业和工作者

1.引言 说到后台作业&#xff0c;你可能条件反射的想到BackgroundWorker&#xff0c;但后台作业并非是后台任务&#xff0c;后台作业用一种队列且持久稳固的方式安排一些待执行后台任务。 为执行长时间运行的任务而用户无需等待&#xff0c;以提高用户体验。为创建可重试且持…

加载中_GIS地图在项目中的加载显示

下面我们就来说说如何在应用程序中加载显示GIS地图&#xff0c;首先我们在SuperMap iDesktop 9D(10i)中编辑好我们需要的地图&#xff0c;如下图所示&#xff1a;如上图所示&#xff0c;这是我编辑好的一幅天河区的地图&#xff0c;下面我就以这幅地图为例来说说如何把这样一幅…

ABP入门系列(21)——切换MySQL数据库

1. 引言 Abp支持MySql已经不是什么新鲜事了&#xff0c;但按照官方文档&#xff1a;Entity Framework - MySql Integration来&#xff0c;你未必能成功切换&#xff0c;本文就记录下切换MySql数据库遇到的一些坑&#xff0c;供后人乘凉&#xff01; 2. 环境准备 MySql数据库…

ABP开发框架前后端开发系列---(1)框架的总体介绍

ABP是ASP.NET Boilerplate的简称&#xff0c;ABP是一个开源且文档友好的应用程序框架。ABP不仅仅是一个框架&#xff0c;它还提供了一个最徍实践的基于领域驱动设计(DDD)的体系结构模型。学习使用ABP框架也有一段时间了,一直想全面了解下这个框架的整个来龙去脉&#xff0c;并把…

c++ pdflib输出表格_DescrTab2包,输出SCI级别的描述统计表

今天浏览R包&#xff0c;发现一个不错的包——DescrTab2包。看R包介绍&#xff0c;这个包可以绘制出版物质量级别的描述统计表。看起来很不错。下面来学习下。1. R包安装和加载install.packages("DescrTab2") # 安装包library(DescrTab2) # 加载包2. 加载演示数据集l…

服务器怎么控制忽略样式_使用JavaScript来编写你的CSS样式代码——JSS

介绍JSS是CSS的创作工具&#xff0c;它允许你使用JavaScript以声明&#xff0c;无冲突和可重用的方式描述样式。它可以在浏览器&#xff0c;服务器端或在构建时在Node中编译。JSS与框架无关。它由多个包组成&#xff1a;核心部分&#xff0c;插件以及框架集成等。Githubhttps:/…

Java设计模式、框架、架构、平台之间的关系

1、设计模式 为什么要先说设计模式?因为设计模式在这些概念中是最基本的&#xff0c;而且也比较简单。那么什么是设计模式呢?说的直白点&#xff0c;设计模式就是告诉你针对特定问题如何组织类、对象和接口之间的关系&#xff0c;是前人总结的经验。比如我要在代码中实现一个…

如何学习(记住)linux命令(常用选项)

作者&#xff1a;林果皞 链接&#xff1a;https://www.zhihu.com/question/21690166/answer/66721478 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 Unix & Linux 命令行特别之处在于&#xff0c;一些选项的设…