說明:datatables是一款jQuery表格插件。感受EasyUI的datagrid更易用javascript
內容:多選框和服務器端分頁css
原因:寫這篇博客的緣由是datatables的文檔寫的不怎麼樣,找東西很麻煩html
環境:asp.net mvc , vs2015+sqlserver2012前端
顯示效果:java
代碼:ajax
html部分:sql
<table id="tbUserList" class="table table-bordered table-hover"> <thead class="text-center "> <tr> <th> <input type="checkbox" class="checkall" /> </th> <th>ID</th> <th>菜單名稱</th> <th>菜單路徑</th> <th>排序</th> <th>添加日期</th> </tr> </thead> <tfoot class="text-center "> <tr> <th> <input type="checkbox" class="checkall" /> </th> <th>ID</th> <th>菜單名稱</th> <th>菜單路徑</th> <th>排序</th> <th>添加日期</th> </tr> </tfoot> </table>
JS部分:json
$(function () { var _dataTables = $('#tbUserList').DataTable({ "lengthChange": false, "searching": false, "ordering": true, "info": true, "autoWidth": false, "pageLength": 10, "serverSide": true, "ajax": { "url": "/BasicManage/GetMenus", "type":"POST" }, "columns": [ { "sClass": "text-center", "data": "ID", "render": function (data, type, full, meta) { return '<input type="checkbox" class="checkchild" value="' + data + '" />'; }, "bSortable": false }, { "data": "ID" }, { "data": "Name" }, { "data": "MenuPage" }, { "data": "SortNo" }, { "data": "AddDateStr" } ] });
JS部分簡單說明:後端
"serverSide": true啓動服務器端分頁服務器
"pageLength": 10 每頁10條記錄,注意pageLength注意大小寫,對應的值必定要是數字,,由於datatables的js裏沒有對這項類型轉換,寫成字符串會出問題。
看下面的源碼
"ajax": 這個就不用說了,去哪取數據
」columns「: 這個的文檔在這裏 http://datatables.net/reference/option/columns
裏面{}的順序對應表格中列的位置。
」data「:對應的是後臺傳過來數據的key
重點說第一個{},是用來在第一列加一列多選框的。
」sClass「:"text-center" 設置的class名,多選框會居中顯示,能夠去datatables的css裏搜索這個class名看具體設置
"data": "ID" 這是要用到的數據,我把checkbox的value設置爲ID,這樣方便取值
」render「 這裏就是要顯示的checkbox多選框了
如何實現全選:
注意這裏用prop
$(".checkall").click(function () { var check = $(this).prop("checked"); $(".checkchild").prop("checked", check); });
獲取選中的某一個checkbox的值
if ($(".checkchild:checked").length > 1)
{
alert("一次只能修改一條數據");
return;
}
var id = $(".checkchild:checked").val();
服務器後端如何傳數據:
public JsonResult GetMenus() { int draw = Convert.ToInt32(Request["draw"]); int start = Convert.ToInt32(Request["start"]); int length = Convert.ToInt32(Request["length"]); int totalCount = 0; MenuDAO Dao = new MenuDAO(); var menus = Dao.GetMvcMenus((start/length)+1, length, out totalCount); return Json(new { draw= draw, recordsTotal= totalCount, recordsFiltered= totalCount, data = menus }, JsonRequestBehavior.AllowGet); }
說明: 前端會向後臺傳一些數據
draw:這個不用關心,直接給它返回去就行了,注意要變成int類型
start: 從第幾條記錄開始,從0開始計數,若是你每頁設置10條記錄,第一頁傳0,第二頁傳10,類推
length: 每頁的記錄條數,對應的前端js設置的pageLength。
返回json :Json(new { draw= draw, recordsTotal= totalCount, recordsFiltered= totalCount, data = menus }, JsonRequestBehavior.AllowGet);
recordsTotal,recordsFiltered這兩個都填總記錄數就好了,data裏就是實際的數據
menus是一個 IEnumerable<Menu>集合
Menu menu = new Menu(); return menu.Select().Where().And("MenuType", "mvc").ExecPageDataTable("ORDER BY ParentID",row,pageSize,out totalCount,Db .AsEnumerable().Select(d => new Menu { ID = d.Field<int>("ID"), Name = d.Field<string>("Name"), MenuPage = d.Field<string>("MenuPage"), IconUrl = d.Field<string>("IconUrl"), SortNo = d.Field<double?>("SortNo"), Remark = d.Field<string>("Remark"), ParentID = d.Field<int?>("ParentID"), AddDateStr = d.Field<DateTime?>("AddDate").ToString() });
題外話:在sqlserver2012上寫分頁sql很是簡單,聽說性能也有提高(沒測試過)
Select * from 某表 ORDER BY 某些列 OFFSET (@row-1)*@pageSize ROWS FETCH NEXT @pageSize ROWS ONLY
替換相應參數 @row 取第幾頁, @pageSize 取多少條