树型菜单数据项AJAX实现增删改查

原创 2015年07月08日 14:42:51

首先请查一下最终的效果:


实现的思路很简单,即首构建一个JSON数据,这里已经通过后台排好序并且已做好了父子关系,然后通过QUI列表控件显示出来,也可以直接用HTML显示,代码如下:

<!--框架必需start-->

<script type="text/javascript" charset="utf-8" src="@Url.Content("~/libs/js/language/cn.js")"></script>
<script type="text/javascript" charset="utf-8" src="@Url.Content("~/libs/js/framework.js")"></script>
<link href="@Url.Content("~/libs/css/import_basic.css")" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" id="skin" />
<!--框架必需end-->

<!--数据表格start-->
<script type="text/javascript" charset="utf-8" src="@Url.Content("~/libs/js/table/quiGrid.js")"></script>
<!--数据表格end-->
<script type="text/javascript" src="@Url.Content("~/libs/js/popup/dialog.js")"></script>
<link href="@Url.Content("~/libs/skins/blue/style.css")" rel="stylesheet" type="text/css" id="theme" themecolor="green" positiontarget="positionContent" />
<div class="main">
    <ul class="mainMenu" id="mainMenu">
        <li class="func"><i></i><a href="@Url.Action("Index", "Fun")">功能库</a></li>
        <li class="app"><i></i><a href="@Url.Action("Index", "App")">应用库</a></li>
        <li class="active set"><i></i><a href="@Url.Action("Index", "Cls")">应用分类维护</a></li>
    </ul>
    <div class="content">
        <!-- end leftTree -->
        <div class="rightCon" style="width: 980px;">
            <div class="rightCon-tit">
                <h1>应用分类维护</h1>
            </div>
            <div class="maintain">
                <div class="search">
                    <div>
                        @*                        <label for="" class="ml20">菜单名称:</label><input type="text" class="input mr20" style="width: 200px;height: 35px;">
                        
                        <input type="button" class="btn" value="查   询">
                        <input type="button" class="btn" value="重   置">*@
                        <input type="button" class="btn add" value="添加一级分类" style="margin-left: 20px;" onclick="onAdd(0, -1);">
                    </div>

                    <div class="buttons">
                    </div>
                </div>
                <div class="m-container">
                    <div id="maingrid"></div>
                </div>
            </div>
            <!-- end maintain -->
        </div>
        <!-- end rightCon -->
    </div>
    <!-- end content -->
</div>

<script type="text/javascript">
    var g;
    function initComplete() {
        g = $("#maingrid").quiGrid({
            columns: [
                { display: '分类名称', name: 'ClsName', id: 'ClsId', width: 400, align: 'left' },
                { display: '创建时间', name: 'CreateTime', width: 250, align: 'center' },
                {
                    display: '操作', isAllowHide: false, align: 'center', width: "250",
                    render: function (rowdata, rowindex, value, column) {
                        var str = '<div class="padding_left5"><span class="icon_add hand" title="新增子级" onclick=onAdd("' + rowdata.ClsId + '","' + rowdata.ClsDepth + '","' + rowindex + '")>新增子级</span>  ';
                        if (rowdata.id != -1 && rowdata.id != 0) {
                            str += '<span class="icon_edit hand" title="修改" onclick=onEdit("' + rowdata.ClsId + '","' + rowdata.ClsName + '","' + rowindex + '")>修改</span>  '
                            str += '<span class="icon_delete hand" title="删除" onclick=onDelete("' + rowdata.ClsId + '","' + rowindex + '")>删除</span> '
                        }

                        str += '</div>';
                        return str;
                    }

                }
            ],
            data: {@Html.Raw(ViewBag.TreeData) },
            height: '450', width: "100%", headerRowHeight: '40', rowHeight: '33', checkbox: false, usePager: false, autoCheckChildren: false, tree: { columnId: 'ClsId' }
        });
    }
    var rowindexs;
    /*新增*/
    function onAdd(id, depth, rowindex) {
        if (depth > 2) {
            alert('最多只能添加三级分类');
            return;
        }
        rowindexs = rowindex;
        top.Dialog.open({
            URL: "@Url.Action("Info", "Cls")" + "?clsId=" + id + "&type=add&userid=@ViewBag.UserId&clsName=",
            Title: "新增分类",
            Width: 450,
            Height: 200
        });

    }
    /*修改*/
    function onEdit(id, clsName, rowindex) {
        rowindexs = rowindex;
        top.Dialog.open({
            URL: "@Url.Action("Info", "Cls")" + "?clsId=" + id + "&type=edit&userid=@ViewBag.UserId&clsName=" + clsName,
            Title: "修改分类",
            Width: 450,
            Height: 200
        });
    }
    /*删除*/
    function onDelete(id, rowindex) {
        if (confirm("您确定要删除选中的分类吗?")) {
            $.post("@Url.Action("Del", "Cls")", { clsId: id }, function (data) {
                if (data.toString() == "-1") {
                    alert("该分类已被关联或使用,无法执行删除操作!");

                } else if (data.toString() == "-2") {
                    alert("该分类下还有子级分类,请先删除!");

                } else if (data.toString() == "1") {
                    alert("操作成功!");
                    deleteGridRow(rowindex);

                } else {
                    alert("操作失败,请与管理员联系!");
                }
            }, "text");
        }
    }


    function deleteGridRow(rowindexs) {

        var row = g.getRow(rowindexs);
        var parent = g.getParent(row);
        var sister = g.getChildren(g.getParent(row));
        g.deleteRow(row);
        if (sister.length == 1) {
            parent.isParent = false;
            parent._hasChildren = false;
            parent.iconClass = "icon_star";
            parent.open = false;
        }
        g.reRender(g.records);
    }

    function addOrUpdateRow(type, clsId, clsName, parentId, createTime) {

        var row = g.getRow(rowindexs);
        var childs = g.getChildren(row);
        var sister = g.getChildren(g.getParent(row));
        if (type == "add") { //新增并且展开 或者 新增下面无子节点
            //设置父级的相关属性
            row.isParent = true;
            row._hasChildren = true;
            row.open = true;
            row.iconClass = "icon_star";

            //获取位置
            var child = null;
            var isdown = false;

            //根据参数获得一个rowdate
            var rowData = {
                ClsId: clsId,
                ClsName: clsName,
                CreateTime: createTime,
                ClsParentId: parentId,

                iconClass: "icon_star"
            }
            //将rowdate新增进g
            g.appendRow(rowData, row, child, true);
            //如果是最大数字

            g.expand(row);


        } else if (type == "edit") { //修改

            ClsId = clsId,
            ClsName = clsName,
            CreateTime = createTime,
            ClsParentId = parentId,

            g.reRender(g.records);
        }
        //重新渲染

    }
    function refershList() {

    }
</script>

后台构建树型菜单JSON数据代码如下:

public ActionResult Index()
        {
            ViewBag.TreeData = GetAppClsList();
            ViewBag.UserId = "";
            return View();
        }

public String GetAppClsList()
        {

            List<D_AppCls> List = _clsBll.GetAppClsList();
            string data = JsonHelper.ConvertToJson(List).Replace("\"", "\"");
            string json = String.Format("\"{0}\":{1}", "rows", data);
            return json;
        }

/// <summary>  
        /// 转换JSON对象集合,包含子集,递归加载  
        /// </summary>  
        /// <param name="companyList"></param>  
        /// <returns></returns>  
        public static string ConvertToJson(List<D_AppCls> companyList)
        {
            string json = "[";
            //获取第一级目录  
            List<D_AppCls> rootList = companyList.Where(x => x.ClsParentId==0).ToList<D_AppCls>();
            foreach (D_AppCls root in rootList)
            {
                string js = ConvertToJson(root);
                string children = "";
                children = DiGui(companyList, children, root.ClsId);
                json += "{" + string.Format(js, children) + "},";
            }
            if (json.LastIndexOf(",") < 1)
            {
                json += "]";
            }
            else
            {
                json = json.Substring(0, json.Length - 1) + "]";
            }
            return json.Replace(",children:[]", null);
        }

        /// <summary>  
        /// 递归调用添加包含子集的JSON数组  
        /// </summary>  
        private static string DiGui(List<D_AppCls> companyList, string children, int pid)
        {
            children = "[";
            List<D_AppCls> childerList = companyList.Where(x => x.ClsParentId == pid).ToList<D_AppCls>();
            foreach (D_AppCls item in childerList)
            {
                string js = ConvertToJson(item);
                string cd = "";
                cd = DiGui(companyList, cd, item.ClsId);
                children += "{" + string.Format(js, cd) + "},";
            }
            if (children.LastIndexOf(",") < 1)
            {
                children += "]";
            }
            else
            {
                children = children.Substring(0, children.Length - 1) + "]";
            }
            return children;
        }

当然还有其它各种实现方法,如直接指定父子项的字段,交给前端UI来处理层级关系(ztree控件),但这种方式更为灵活,可以指定多列数据属性的显示,还可以控制菜单项的状态等,留给我们更多的开发和定制余地。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java系统架构设计

Java 应用一般架构 原文地址:http://segmentfault.com/a/1190000004004963 1. 不同系统不同语言之间的交互 现在我们常见的不同系统不同语...

架构设计:负载均衡层设计方案(3)——Nginx进阶

上篇文章《架构设计:负载均衡层设计方案(2)——Nginx安装》(http://blog.csdn.net/yinwenjie/article/details/46620711),我们介绍了Nginx...

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

一、设计模式(Design Patterns)                                    ...

Java应用架构设计的七次重构详解

在开发系统时,虽然一个很小的系统,开始时它也是粗粒度和重量级的模块;当特定的需要出现时,我们将会把较大的模块儿拆分为较细粒度和轻量级的模块,他们会处理特定的功能性和非功能性需求。而七次重构就是从一个系...

一个实际项目Java架构设计之总体设计

一个实际项目Java架构设计之总体设计 标签: javajava架构设计Spring MVCmybatis 2015-06-12 23:10 1891人阅读 评论(6) 收藏 举报 ...

架构设计:负载均衡层设计方案(1)——负载场景和解决方式

在上一篇《标准Web系统的架构分层》文章中,我们概述了WEB系统架构中的分层架设体系,介绍了包括负载均衡层、业务层、业务通信层、数据存储层的作用和存在意义。从本片文章开始,我们将首先详细讲解负载均衡层...

Java分布式应用技术架构介绍

分布式架构的演进 系统架构演化历程-初始阶段架构 初始阶段 的小型系统 应用程序、数据库、文件等所有的资源都在一台服务器上通俗称为LAMP 特征: 应用程序、数据库、文件等所有...

一句话讲清楚什么是JavaEE

一句话讲清楚什么是JavaEE Java技术不仅是一门编程语言而且是一个平台。同时Java语言是一门有着特定语法和风格的高级的面向对象的语言,Java平台是Java语言编写的特定应用程序运行的环境。...

架构设计:负载均衡层设计方案(4)——LVS原理

之前我们花了两篇文章的篇幅,详细讲解了Nginx的原理、安装和特性组件。后面有时间我们还会重新回到Nginx的讲解上。从本篇文章开始,我们将开始介绍LVS技术,包括基本概念、简单使用和进阶使用。本篇文...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)