当前位置:编程学习 > C#/ASP.NET >>

树形结构菜单,节点显示问题

需求:
不显示没有记录的菜单节点。
子节点无记录,子节点隐藏。
父节点下的子节点,孙节点都没有记录,父节点和子、孙节点都隐藏。

解决这个问题,可以从两个方向考虑
1.调取菜单时
2.向菜单节点写入记录时

第一种如果使用了缓存,性能问题可以控制
第二种给节点加个持久化的状态标记,写入记录时,设置标记,我这里想到一个思路,采用第二种,这样在写入记录时设置了一个规则:“插入删除记录时,必须设置所属菜单的状态”
代码如下:
     public interface IMenu1
    {
        int Add<Menu1>(Menu1 t);
    }

    public abstract class BaseMenu
    {
        public int Add<T>(T t)
        {
            var result = this.Insert<T>(t);
            //设置父节点为显示
//T是记录对象,这里只能考虑用反射对应 T 的 父节点对象,或者每个抽象类只对应一个同类型的派生类
            return result;
        }
        protected abstract int Insert<T>(T t);
    }

    public class Menu1 : BaseMenu, IMenu1
    {
        protected override int Insert<T>(T t)
        {
            //调用仓储写入记录
            return 0;
        }
    }

欢迎大家提意见了 需求 --------------------编程问答-------------------- 这样的方案当然没有问题,不过我觉得这样使业务变复杂了。可能会有这些缺点:
1、如果用户要求上线的时候初始化数据,数据量多的时候,页面直接操作浪费时间,写脚本导入又比较麻烦。
2、对于新增删除增加了对冗余字段的要求,后续人员维护多多少少会增加成本。
3、功能、业务都不复杂,如果该需求是稳定,不会经常变化的,何必搞得又是接口又是抽象类呢?还需要反射??个人不喜欢为了技术而技术。
4、菜单一般都与用户权限相关,这样的设计,难与权限关联。



我建议数据库保存基本数据,web端直接获取基本数据,再在web的bll中遍历数据源决定菜单的生成。 --------------------编程问答--------------------
引用 1 楼 Iovswety 的回复:
这样的方案当然没有问题,不过我觉得这样使业务变复杂了。可能会有这些缺点:
1、如果用户要求上线的时候初始化数据,数据量多的时候,页面直接操作浪费时间,写脚本导入又比较麻烦。
2、对于新增删除增加了对冗余字段的要求,后续人员维护多多少少会增加成本。
3、功能、业务都不复杂,如果该需求是稳定,不会经常变化的,何必搞得又是接口又是抽象类呢?还需要反射??个人不喜欢为了技术而技术。
4、菜单一般都与用户权限相关,这样的设计,难与权限关联。



我建议数据库保存基本数据,web端直接获取基本数据,再在web的bll中遍历数据源决定菜单的生成。

+1 我做过这样的权限管理模块 这个其实一点难度都没有。关键就是用固定步长区分节点等级 --------------------编程问答-------------------- 这里是这样的
比如有个新闻类型
“热门新闻”
类下会录入N条新闻

在菜单中是否显示 “热门新闻”,需要判断此类别下是否有记录。
如果在前端查询类别是否有记录的话,每次展开菜单都需要查询一次是否有记录
如果在树形菜单上,节点是很多的并且每个节点都需要查询是否有记录,那么每次展开菜单,对数据库压力很大

至于权限,照常使用就可以,一楼我写的代码,只是把查询是否有记录的工作,转移到了录入数据时而已
补充:.NET技术 ,  分析与设计
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,