最近在研究layui插件,需要用到treetable树形数据表格,查看了一下官方文档和示列
layui文档地址:https://layui.dev/docs/2.8/treeTable/
gitee地址:https://gitee.com/layui/layui
这是官方的示列代码,只需引用layui.js,在script中实例化一下treetable就可以使用了
layui.use(function(){
var treeTable = layui.treeTable;
var layer = layui.layer;
var dropdown = layui.dropdown;
// 渲染
var inst = treeTable.render({
elem: '#ID-treeTable-demo',
url: '/static/2.8/json/treeTable/demo-1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
tree: {
/*
// 异步加载子节点
async: {
enable: true,
url: '/static/2.8/json/treeTable/demo-async.json', // 此处为静态模拟数据,实际使用时需换成真实接口
autoParam: ["parentId=id"]
}
*/
},
maxHeight: '501px',
toolbar: '#TPL-treeTable-demo',
cols: [[
{type: 'checkbox', fixed: 'left'},
{field: 'id', title: 'ID', width: 80, sort: true, fixed: 'left'},
{field: 'name', title: '用户名', width: 180, fixed: 'left'},
{field: 'experience', title: '积分', width: 90, sort: true},
{field: 'sex', title: '性别', width: 80, sort: true},
{field: 'score', title: '评分', width: 80, sort: true},
{field: 'city', title: '城市'},
{ fixed: "right", title: "操作", width: 181, align: "center", toolbar: "#TPL-treeTable-demo-tools"}
]],
page: true
});
因为查看了一下先前第三方的treetable的使用方法,返回的数据只需要标注ID和parentid就行,然后我就试了一下官方的可不可以,发现不行,于是看了一下demo-1.json这个文件
可以看到需要的数据格式是这样的,于是我就把取过来的list进行了拼接试一试,开始的代码是这样的:
public ActionResult getModule(int limit, int page)
{
List<SysModuleModel> list = bll.getModule();
List<SysModuleModel> list2 = new List<SysModuleModel>();
//list2 = list.OrderBy(a => a.ID).Skip(limit * (page - 1)).Take(limit).ToList();
list2 = list.Where(a => a.PARENTID == "0").Skip(limit * (page - 1)).Take(limit).ToList();
string str = "[";
for (int i = 0; i < list2.Count; i++)
{
str += "{";
str += "\"ID\":";
str += "\"" + list2[i].ID + "\",";
str += "\"MODULEID\":";
str += "\"" + list2[i].MODULEID + "\",";
str += "\"MODULENAME\":";
str += "\"" + list2[i].MODULENAME + "\",";
str += "\"MODULEDESCRIPTION\":";
str += "\"" + list2[i].MODULEDESCRIPTION + "\",";
str += "\"MODULEURL\":";
str += "\"" + list2[i].MODULEURL + "\",";
str += "\"MENUICON\":";
str += "\"" + list2[i].MENUICON + "\",";
str += "\"ORDERNO\":";
str += "\"" + list2[i].ORDERNO + "\",";
str += "\"USERCREATED\":";
str += "\"" + list2[i].USERCREATED + "\",";
str += "\"TIMECREATED\":";
str += "\"" + list2[i].TIMECREATED + "\",";
str += "\"PARENTID\":";
str += "\"" + list2[i].PARENTID + "\",";
List<SysModuleModel> list3 = list.Where(u => u.PARENTID == list2[i].MODULEID).ToList();
str += "\"children\":[";
if (list3.Count > 0)
{
string str2 = "";
for (int j = 0; j < list3.Count; j++)
{
str2 += "{";
str2 += "\"ID\":";
str2 += "\"" + list3[j].ID + "\",";
str2 += "\"MODULEID\":";
str2 += "\"" + list3[j].MODULEID + "\",";
str2 += "\"MODULENAME\":";
str2 += "\"" + list3[j].MODULENAME + "\",";
str2 += "\"MODULEDESCRIPTION\":";
str2 += "\"" + list3[j].MODULEDESCRIPTION + "\",";
str2 += "\"MODULEURL\":";
str2 += "\"" + list3[j].MODULEURL + "\",";
str2 += "\"MENUICON\":";
str2 += "\"" + list3[j].MENUICON + "\",";
str2 += "\"ORDERNO\":";
str2 += "\"" + list3[j].ORDERNO + "\",";
str2 += "\"USERCREATED\":";
str2 += "\"" + list3[j].USERCREATED + "\",";
str2 += "\"TIMECREATED\":";
str2 += "\"" + list3[j].TIMECREATED + "\",";
str2 += "\"PARENTID\":";
str2 += "\"" + list3[j].PARENTID + "\",";
str2 += "\"children\":[],";
//str2 += "},";
str2 += "\"isParent\":false},";
}
str += str2.Substring(0, str2.Length - 1).ToString() + "],";
//str += "},";
str += "\"isParent\":true},";
}
else
{
str += "],";
//str += "},";
str += "\"isParent\":false}";
}
}
string str3 = str.Substring(0, str.Length - 1).ToString() + "]";
var result = new
{
code = 0,
msg = "",
count = list.Count(),
data = JsonConvert.DeserializeObject(str3)
};
return Json(result, JsonRequestBehavior.AllowGet);
}
发现运行于以后,treetable一直正处于转圈圈的状态,然后我alert()了一下返回的数据,发现data后面是[{},{}]这样的数据,就是MVC的json化无法识别反序列化后的数据于是我查找了类似问题,具体参考:
https://blog.csdn.net/qq_35077107/article/details/104271365该作者的博客
新代码如下:
public ActionResult getModule(int limit, int page)
{
List<SysModuleModel> list = bll.getModule();
List<SysModuleModel> list2 = new List<SysModuleModel>();
list2 = list.Where(a => a.PARENTID == "0").Skip(limit * (page - 1)).Take(limit).ToList();
string str = "[";
for (int i = 0; i < list2.Count; i++)
{
str += "{";
str += "\"ID\":";
str += "\"" + list2[i].ID + "\",";
str += "\"MODULEID\":";
str += "\"" + list2[i].MODULEID + "\",";
str += "\"MODULENAME\":";
str += "\"" + list2[i].MODULENAME + "\",";
str += "\"MODULEDESCRIPTION\":";
str += "\"" + list2[i].MODULEDESCRIPTION + "\",";
str += "\"MODULEURL\":";
str += "\"" + list2[i].MODULEURL + "\",";
str += "\"MENUICON\":";
str += "\"" + list2[i].MENUICON + "\",";
str += "\"ORDERNO\":";
str += "\"" + list2[i].ORDERNO + "\",";
str += "\"USERCREATED\":";
str += "\"" + list2[i].USERCREATED + "\",";
str += "\"TIMECREATED\":";
str += "\"" + list2[i].TIMECREATED + "\",";
str += "\"PARENTID\":";
str += "\"" + list2[i].PARENTID + "\",";
List<SysModuleModel> list3 = list.Where(u => u.PARENTID == list2[i].MODULEID).ToList();
str += "\"children\":[";
if (list3.Count > 0)
{
string str2 = "";
for (int j = 0; j < list3.Count; j++)
{
str2 += "{";
str2 += "\"ID\":";
str2 += "\"" + list3[j].ID + "\",";
str2 += "\"MODULEID\":";
str2 += "\"" + list3[j].MODULEID + "\",";
str2 += "\"MODULENAME\":";
str2 += "\"" + list3[j].MODULENAME + "\",";
str2 += "\"MODULEDESCRIPTION\":";
str2 += "\"" + list3[j].MODULEDESCRIPTION + "\",";
str2 += "\"MODULEURL\":";
str2 += "\"" + list3[j].MODULEURL + "\",";
str2 += "\"MENUICON\":";
str2 += "\"" + list3[j].MENUICON + "\",";
str2 += "\"ORDERNO\":";
str2 += "\"" + list3[j].ORDERNO + "\",";
str2 += "\"USERCREATED\":";
str2 += "\"" + list3[j].USERCREATED + "\",";
str2 += "\"TIMECREATED\":";
str2 += "\"" + list3[j].TIMECREATED + "\",";
str2 += "\"PARENTID\":";
str2 += "\"" + list3[j].PARENTID + "\",";
str2 += "\"children\":[],";
//str2 += "},";
str2 += "\"isParent\":false},";
}
str += str2.Substring(0, str2.Length - 1).ToString() + "],";
str += "\"isParent\":true},";
}
else
{
str += "],";
str += "\"isParent\":false}";
}
}
string str3 = str.Substring(0, str.Length - 1).ToString() + "]";
List<SysModuleModel> list4 = JsonConvert.DeserializeObject<List<SysModuleModel>>(str3);
var result = new
{
code = 0,
msg = "",
count = list.Count(),
data = list4
};
return Json(result, JsonRequestBehavior.AllowGet);
}
前端代码如下:
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_LayoutMaster.cshtml";
}
<div class="layui-inline" id="searchKeywordf" style="margin-left:5px">
<input type="text" autocomplete="off" id="keyword" placeholder="关键字..." class="layui-input">
</div>
<button id="query" type="button" class="layui-btn layui-btn-sm layui-btn-normal"><i class="layui-icon layui-icon-search"></i>查询</button>
<button id="add" type="button" class="layui-btn layui-btn-sm"><i class="layui-icon layui-icon-addition"></i>新增</button>
<table id="ModuleTable" lay-filter="ModuleTable" class="layui-hide"></table>
<script type="text/html" id="tool">
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="detail"><i class="layui-icon layui-icon-edit"></i>详情</button>
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="edit"><i class="layui-icon layui-icon-delete"></i>编辑</button>
</script>
@section Scripts{
<script>
layui.use(['layer', 'form', 'treeTable','table'], function () {
var table = layui.table;
var layer = layui.layer;
var treeTable = layui.treeTable;
var util = layui.util;
// 渲染
treeTable.render({
elem:'#ModuleTable',
url: '/Module/getModule',
height: 'full-210',
toolbar:true,
defaultToolbar: ['filter', 'print', 'exports'],
page: true,
tree: {
customName: {
isParent:"isParent",//自定义「子节点集合」的属性名
children:"children",//自定义「是否属于父节点」的属性名
name: "MODULENAME", // 节点数据保存节点名称的属性名称
id: "MODULEID", // 唯一标识的属性名称
pid: "PARENTID", // 父节点唯一标识的属性名称
icon: "MENUICON" // 图标的属性名称
}
},
done: function (res) {
treeTable.expandAll('ModuleTable', true);
},
cols:[[
{ field: 'ID', title: '序号', width: 80, templet: function (obj) { return obj.LAY_INDEX; } },
{ field: 'MODULEID', title: '菜单代码'},
{ field: 'MODULENAME', title: '菜单名称'},
{ field: 'MODULEDESCRIPTION', title: '描述'},
{ field: 'MODULEURL', title: '菜单路由'},
{ field: 'MENUICON', title: '图标', align: 'center', templet: '<div><i class="layui-icon {{d.MENUICON}}"></i></div>' },
{ field: 'ORDERNO', title: '顺序号', align: 'center'},
{ field: 'USERCREATED', title: '创建人', align: 'center' },
{ field: 'TIMECREATED', title: '创建时间', align: 'center', templet: function (d) { var time = parseInt(d.TIMECREATED.toString().replace("/Date(", "").replace(")/", "")); return util.toDateString(time, 'yyyy-MM-dd HH:mm:ss') } },
{ field: 'PARENTID', title: '父ID'},
{ toolbar: '#tool', align: 'center', title: '操作' }
]]
});
});
</script>
}
这是Mdoel:
public class SysModuleModel
{
public string ID { get; set; }
public string MODULEID { get; set; }
public string MODULENAME { get; set; }
public string MODULEDESCRIPTION { get; set; }
public string MODULEURL { get; set; }
public string MENUICON { get; set; }
public string ORDERNO { get; set; }
public string USERCREATED { get; set; }
public DateTime TIMECREATED { get; set; }
public string PARENTID { get; set; }
public List<SysModuleModel> children { get; set; }
public bool isParent { get; set; }
}
最后结果如下图: