首頁  >  文章  >  web前端  >  在bootstraptable中使用外掛程式來實現表格的查詢、分頁和排序等操作講解

在bootstraptable中使用外掛程式來實現表格的查詢、分頁和排序等操作講解

PHPz
PHPz原創
2018-05-25 11:33:555611瀏覽

這篇文章主要介紹了 使用bootstraptable外掛實現表格記錄的查詢、分頁、排序​​操作,需要的朋友可以參考下Bootstrap教程

在業務系統開發中,對錶格記錄的查詢、分頁、排序​​等處理是非常常見的,在Web開發中,可以採用很多功能強大的插件來滿足要求,且能極大的提升開發效率,本隨筆介紹這個bootstrap-table是一款非常有名的開源表格插件,在許多專案中廣泛的應用。 Bootstrap-table插件提供了非常豐富的屬性設置,可實現查詢、分頁、排序​​、複選框、設置顯示列、Card view視圖、主從表顯示、合併列、國際化處理等處理功能,而且該插件同時也提供了一些不錯的擴充功能,如移動行、移動列位置等一些特殊的功能,插件可以用基於HTML5的data-*屬性標識設置,也可以使用Javascript方式進行設置,非常方便。本篇隨筆介紹bootstrap-table插件在我實際專案中的應用情況,總結相關使用中碰到的問題處理經驗。

1、Bootstrap-table資源及使用介紹

Bootstrap-Table顯示資料到表格的方式有兩種,一種是客戶端(client)模式,一種是伺服器(server)模式。

  所謂客戶端模式,指的是在伺服器中把要顯示到表格的資料一次載入出來,然後轉換成JSON格式傳到要顯示的介面中,客戶端模式較為簡單,它是把資料一次載入出來放到介面上,然後根據你設定的每頁記錄數,自動生成分頁。點擊第二頁時,會自動載入出數據,不會再向伺服器發送請求。同時用戶可以使用其自帶的搜尋功能,可以實現全數據搜尋。對於資料量較少的時候,可以使用這個方法。

  所謂伺服器模式,指的是根據設定的每頁記錄數和目前要顯示的頁碼,發送資料到伺服器進行查詢,然後再顯示到表格中。此方法可以根據使用者的需求動態的載入數據,節省了伺服器的資源,但是不能使用其自帶的全數據搜尋功能。

Bootstrap-table是基於Boostrap開發的插件,因此使用的時候,需要引入Bootstrap的腳本和樣式。

如果我們專案中沒有引入相關的文件,則需要引入這些樣式和腳本文件,如下所示。

<link rel="stylesheet" href="bootstrap.min.css" rel="external nofollow" >
<script src="jquery.min.js"></script>
<script src="bootstrap.min.js"></script>

不過以上內容,在我們開發專案的時候都肯定有的了,所以我們還是把中心放到使用這個外掛程式所需的引入檔案上。

CSS檔案引入

<link rel="stylesheet" href="bootstrap-table.css" rel="external nofollow" >

腳本檔案引入

<script src="bootstrap-table.js"></script>
<--汉化文件,放在 bootstrap-table.js 后面-->
<script src="bootstrap-table-zh-CN.js"></script>

 一般來說我們如果是基於MVC開發的系統,CSS和JS的程式碼,都是放在BundleConfig. cs裡面初始化的,如下所示

bootstrap-table在頁面中的使用,可以分為兩種,一種是純粹用HTML5的寫法,透過data-*的方式指定各種屬性設置,一種是HTML+JS方式實現彈性設定。

如果我們採用HTML5標識的方式初始化HTML程式碼,則是下面的程式碼。

<table data-toggle="table" data-url="data1.json">
 <thead>
  <tr>
   <th data-field="id">Item ID</th>
   <th data-field="name">Item Name</th>
   <th data-field="price">Item Price</th>
  </tr>
 </thead>
</table>

如果我們採用JS程式碼方式來初始化表格插件,那麼只需要在HTML上宣告一個表格物件即可,如下程式碼。

<table id="table"></table>

然後簡單的JS程式碼初始化如下所示

$(&#39;#table&#39;).bootstrapTable({
 url: &#39;data1.json&#39;,
 columns: [{
  field: &#39;id&#39;,
  title: &#39;Item ID&#39;
 }, {
  field: &#39;name&#39;,
  title: &#39;Item Name&#39;
 }, {
  field: &#39;price&#39;,
  title: &#39;Item Price&#39;
 }, ]
});

不過實際上我們使用bootstrap-table的JS配置功能肯定比這個複雜很多,下面介面效果是實際表的資料展示。

2、bootstrap-table的詳細使用

1)整個JS屬性配置

在上圖中,我們是使用JS方式進行初始化表格內容的,JS程式碼如下所示

 var $table;
  //初始化bootstrap-table的内容
  function InitMainTable () {
   //记录页面bootstrap-table全局变量$table,方便应用
   var queryUrl = &#39;/TestUser/FindWithPager?rnd=&#39; + Math.random()
   $table = $(&#39;#grid&#39;).bootstrapTable({
    url: queryUrl,      //请求后台的URL(*)
    method: &#39;GET&#39;,      //请求方式(*)
    //toolbar: &#39;#toolbar&#39;,    //工具按钮用哪个容器
    striped: true,      //是否显示行间隔色
    cache: false,      //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
    pagination: true,     //是否显示分页(*)
    sortable: true,      //是否启用排序
    sortOrder: "asc",     //排序方式
    sidePagination: "server",   //分页方式:client客户端分页,server服务端分页(*)
    pageNumber: 1,      //初始化加载第一页,默认第一页,并记录
    pageSize: rows,      //每页的记录行数(*)
    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,     //是否显示父子表
    //得到查询的参数
    queryParams : function (params) {
     //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
     var temp = { 
      rows: params.limit,       //页面大小
      page: (params.offset / params.limit) + 1, //页码
      sort: params.sort,  //排序列名 
      sortOrder: params.order //排位命令(desc,asc) 
     };
     return temp;
    },
    columns: [{
     checkbox: true, 
     visible: true     //是否显示复选框 
    }, {
     field: &#39;Name&#39;,
     title: &#39;姓名&#39;,
     sortable: true
    }, {
     field: &#39;Mobile&#39;,
     title: &#39;手机&#39;,
     sortable: true
    }, {
     field: &#39;Email&#39;,
     title: &#39;邮箱&#39;,
     sortable: true,
     formatter: emailFormatter
    }, {
     field: &#39;Homepage&#39;,
     title: &#39;主页&#39;,
     formatter: linkFormatter
    }, {
     field: &#39;Hobby&#39;,
     title: &#39;兴趣爱好&#39;
    }, {
     field: &#39;Gender&#39;,
     title: &#39;性别&#39;,
     sortable: true
    }, {
     field: &#39;Age&#39;,
     title: &#39;年龄&#39;
    }, {
     field: &#39;BirthDate&#39;,
     title: &#39;出生日期&#39;,
     formatter: dateFormatter
    }, {
     field: &#39;Height&#39;,
     title: &#39;身高&#39;
    }, {
     field: &#39;Note&#39;,
     title: &#39;备注&#39;
    }, {
     field:&#39;ID&#39;,
     title: &#39;操作&#39;,
     width: 120,
     align: &#39;center&#39;,
     valign: &#39;middle&#39;,
     formatter: actionFormatter
    }, ],
    onLoadSuccess: function () {
    },
    onLoadError: function () {
     showTips("数据加载失败!");
    },
    onDblClickRow: function (row, $element) {
     var id = row.ID;
     EditViewById(id, &#39;view&#39;);
    },
   });
  };

上面JS程式碼的設定屬性,基本上都加了註解說明,是比較容易理解的了。

2)查詢及分頁

這裡的表格資料分頁是採用伺服器分頁的方式,根據搜尋條件從伺服器傳回資料記錄的,並使用了排序的處理方式,這裡的queryParams參數就是提交到伺服器端的參數了          

 //得到查询的参数
    queryParams : function (params) {
     //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
     var temp = { 
      rows: params.limit,       //页面大小
      page: (params.offset / params.limit) + 1, //页码
      sort: params.sort,  //排序列名 
      sortOrder: params.order //排位命令(desc,asc) 
     };
     return temp;
    },

另外我們看到回傳資料的URL位址介面是FindWithPager,我們來看看這個MVC控制器方法是如何處理資料回傳的。

/// <summary>
  /// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
  /// </summary>
  /// <returns>指定对象的集合</returns>
  public override ActionResult FindWithPager()
  {
   //检查用户是否有权限,否则抛出MyDenyAccessException异常
   base.CheckAuthorized(AuthorizeKey.ListKey);

   string where = GetPagerCondition();
   PagerInfo pagerInfo = GetPagerInfo();
   var sort = GetSortOrder();

   List<TestUserInfo> list = null;
   if (sort != null && !string.IsNullOrEmpty(sort.SortName))
   {
    list = baseBLL.FindWithPager(where, pagerInfo, sort.SortName, sort.IsDesc);
   }
   else
   {
    list = baseBLL.FindWithPager(where, pagerInfo);
   } 

   //Json格式的要求{total:22,rows:{}}
   //构造成Json的格式传递
   var result = new { total = pagerInfo.RecordCount, rows = list };
   return ToJsonContent(result);
  }

上面程式碼處理了兩個部分的物件訊息,一個是分頁實體類別訊息,一個是排序信息,然後根據這些條件獲取記錄,返回類似
{total:22,rows:{ }}

格式的JSON資料記錄。          

var result = new { total = pagerInfo.RecordCount, rows = list };
   return ToJsonContent(result);

取得分頁的參數資訊如下圖      

 /// <summary>
  /// 根据Request参数获取分页对象数据
  /// </summary>
  /// <returns></returns>
  protected virtual PagerInfo GetPagerInfo()
  {
   int pageIndex = Request["page"] == null ? 1 : int.Parse(Request["page"]);
   int pageSize = Request["rows"] == null ? 10 : int.Parse(Request["rows"]);

   PagerInfo pagerInfo = new PagerInfo();
   pagerInfo.CurrenetPageIndex = pageIndex;
   pagerInfo.PageSize = pageSize;
   return pagerInfo;
  }

取得排序參數資訊的程式碼如下所示

 /// <summary>
  /// 获取排序的信息
  /// </summary>
  /// <returns></returns>
  protected SortInfo GetSortOrder()
  {
   var name = Request["sort"];
   var order = Request["sortOrder"];
   return new SortInfo(name, order);
  }

最后就是具体实现具体条件、具体页码、具体排序条件下的数据记录了,这部分可以根据自己的要求实现逻辑,这里只是给出一个封装好的处理调用即可。

baseBLL.FindWithPager(where, pagerInfo, sort.SortName, sort.IsDesc);

实际情况下,我们列表的展示,一般需要使用不同的条件进行数据的查询的,虽然这个Bootstrap-table控件提供了一个默认的查询按钮,不过一般是在客户端分页的情况下使用,而且略显简单,我们一般使用自己查询条件进行处理,如下界面所示。

或者如下的

那么这样对于上面的js属性就需要调整下接受查询条件参数queryParams 了            

 //得到查询的参数
    queryParams : function (params) {
     //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
     var temp = { 
      rows: params.limit,       //页面大小
      page: (params.offset / params.limit) + 1, //页码
      sort: params.sort,  //排序列名 
      sortOrder: params.order //排位命令(desc,asc) 
     };
     return temp;
    },

对于自定义查询条件,我们可以用下面的常规方式增加参数,如下所示

但是查询条件的参数我们不方便一一设置,我们想通过一种较为快捷的方式来处理,那么就需要对这个处理方式进行一个特别的修改了,首先添加一个扩展函数来处理表单的条件

 //自定义函数处理queryParams的批量增加
  $.fn.serializeJsonObject = function () {
   var json = {};
   var form = this.serializeArray();
   $.each(form, function () {
    if (json[this.name]) {
     if (!json[this.name].push) {
      json[this.name] = [json[this.name]];
     }
     json[this.name].push();
    } else {
     json[this.name] = this.value || &#39;&#39;;
    }
   });
   return json;
  }

然后我们就可以批量处理表单的查询条件了        

 queryParams : function (params) {
     //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
     var temp = $("#ffSearch").serializeJsonObject();
     temp["rows"] = params.limit;      //页面大小
     temp["page"] = (params.offset / params.limit) + 1; //页码
     temp["sort"] = params.sort;       //排序列名
     temp["sortOrder"] = params.order;     //排位命令(desc,asc) 

     //特殊格式的条件处理
     temp["WHC_Age"] = $("#WHC_Age").val() + "~" + $("#WHC_Age2").val();
     temp["WHC_BirthDate"] = $("#WHC_BirthDate").val() + "~" + $("#WHC_BirthDate2").val();

     return temp;
    },

然后后端统一按照逻辑处理查询参数即可。

3)格式化输出函数及其他

对于上面JS的配置信息,我们再来回顾一下,例如对于数据转义函数,可以格式化输出的内容的,如下界面代码。

格式化的数据转义函数如下,主要就是根据内容进行格式化输出的JS函数,好像是需要放在一个文件内。

 //连接字段格式化
  function linkFormatter(value, row, index) {    
   return "<a href=&#39;" + value + "&#39; title=&#39;单击打开连接&#39; target=&#39;_blank&#39;>" + value + "</a>";
  }
  //Email字段格式化
  function emailFormatter(value, row, index) {
   return "<a href=&#39;mailto:" + value + "&#39; title=&#39;单击打开连接&#39;>" + value + "</a>";
  }
  //性别字段格式化
  function sexFormatter(value) {
   if (value == "女") { color = &#39;Red&#39;; }
   else if (value == "男") { color = &#39;Green&#39;; }
   else { color = &#39;Yellow&#39;; }

   return &#39;<p style="color: &#39; + color + &#39;">&#39; + value + &#39;</p>&#39;;
  }

另外,我们看到行记录的最后增加了几个操作按钮,方便对当前记录的查看、编辑和删除操作,如下效果图所示。

这部分我们也是通过格式化函数进行处理的

 //操作栏的格式化
  function actionFormatter(value, row, index) {
   var id = value;
   var result = "";
   result += "<a href=&#39;javascript:;&#39; class=&#39;btn btn-xs green&#39; onclick=\"EditViewById(&#39;" + id + "&#39;, view=&#39;view&#39;)\" title=&#39;查看&#39;><span class=&#39;glyphicon glyphicon-search&#39;></span></a>";
   result += "<a href=&#39;javascript:;&#39; class=&#39;btn btn-xs blue&#39; onclick=\"EditViewById(&#39;" + id + "&#39;)\" title=&#39;编辑&#39;><span class=&#39;glyphicon glyphicon-pencil&#39;></span></a>";
   result += "<a href=&#39;javascript:;&#39; class=&#39;btn btn-xs red&#39; onclick=\"DeleteByIds(&#39;" + id + "&#39;)\" title=&#39;删除&#39;><span class=&#39;glyphicon glyphicon-remove&#39;></span></a>";
   return result;
  }

 

如果我们需要双击弹出编辑界面的层,我们可以处理表格的双击事件,如下代码所示。

      onDblClickRow: function (row, $element) {
          var id = row.ID;
          EditViewById(id, &#39;view&#39;);
        },

如果我们需要设置行的不同的样式展示,可以通过增加rowStyle的JS处理函数即可,如下代码所示

       rowStyle: function (row, index) { //设置行的特殊样式
          //这里有5个取值颜色[&#39;active&#39;, &#39;success&#39;, &#39;info&#39;, &#39;warning&#39;, &#39;danger&#39;];
          var strclass = "";
          if (index == 0) {
            strclass = "warning";
          }
          return { classes: strclass }
        }

 对于表格记录的获取,我们可以通过下面的代码进行获取:$table.bootstrapTable('getSelections')

      var rows = $table.bootstrapTable(&#39;getSelections&#39;);
      if (rows.length > 0) {
        ID = rows[0].ID;
      }

如果是多条记录的处理,例如删除记录

    //实现删除数据的方法
    function Delete() {
      var ids = "";//得到用户选择的数据的ID
      var rows = $table.bootstrapTable(&#39;getSelections&#39;);
      for (var i = 0; i < rows.length; i++) {
        ids += rows[i].ID + &#39;,&#39;;
      }
      ids = ids.substring(0, ids.length - 1);
      DeleteByIds(ids);
    }

如果需要设置显示列显示,如下界面所示

以及排序处理

这些需要在JS代码开启相关的属性即可。

还有就是一种CardView的卡片视图格式,如下所示。

另外一种是父子表的展开明细的格式,如下所示

 以上就是bootstrap-table插件在我实际项目中的应用情况,基本上对JS各个属性的使用进行了一些介绍了,具体的应用我们可以参考它的文档,获取对应属性、方法、事件的详细说明,这样我们就可以更加详细的应用这个插件的各种功能了。

以上是在bootstraptable中使用外掛程式來實現表格的查詢、分頁和排序等操作講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn