做权限的时候,主要实现如下功能
            1、该节点可以访问,则他的父节点也必能访问;
     2、该节点可以访问,则他的子节点也都能访问;
     3、该节点不可访问,则他的子节点也不能访问。
         使用带CheckBox的数型结构能得到很好的用户体验,可是编程的难度也是有点增加,如果全部有服务端来完成,那点下刷下,肯定不行,只能使用javascript,javascript调试的时候郁闷的很,一个字类,还有郁闷的递归,麻烦
我以前是使用以下该方法

<script language="javascript">
<!--
        //初始化节点
        initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
        
            //初始化选中节点
            function initchecknode(tree,tvvalue)
            {
                //获得需要初始化选择状态的节点的字符串.
                var selectedNodes = tvvalue;
                var arrayNodes = new Array();
                arrayNodes = selectedNodes.split(",");
                var AllRootNode=new Array();
                AllRootNode=document.getElementById(tree).getChildren();
                //初始化选择的节点
                findAndCheckedNodes(AllRootNode,arrayNodes);
            }

            //根据已选择的节点的字符串初始化选择的节点
            function findAndCheckedNodes(NodeArray,nodeDatas)
            {
                //alert(NodeArray.length);
                 if(parseInt(NodeArray.length)==0)
                 {
                    return;
                }
                else
                {
                    for(var i=0;i<parseInt(NodeArray.length);i++)
                    {
                        var cNode,nodeData;
                        cNode=NodeArray[i];
                        ////如果该节点在nodeDatas里则初始化checked = true;
                        nodeData = cNode.getAttribute("NodeData");
                        for(var j=0;j<nodeDatas.length;j++)
                        {
                            if(nodeDatas[j] == nodeData)
                            {
                                cNode.setAttribute("checked","true");
                                break;
                            }
                        }
                        //如果有子节点,则继续递归
                        if(parseInt(cNode.getChildren().length)!=0)
                        findAndCheckedNodes(cNode.getChildren(),nodeDatas);    
                    }
                }
            }
//-->
//oncheck事件
function tree_oncheck(tree)
{
 var i;
 var node=tree.getTreeNode(tree.clickedNodeIndex);
 var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked"); 
 setcheck(node,Pchecked);
 setParent(node,Pchecked);
//window.alert(Pchecked);
 document.all.checked.value = "";
 if (tree.getChildren().length > 0)
 {
    for (i=0;i<=tree.getChildren().length-1;i++)
    {
        if (tree.getChildren()[i].getAttribute("Checked"))
        {
             AddChecked(tree.getChildren()[i]);
        }    
        FindCheckedFromNode(tree.getChildren()[i]);
    }
 }
}
//设置子节点选中

function setcheck(node,Pchecked)
{
 var i;
 var ChildNode=new Array();
 ChildNode=node.getChildren();
 
 if(parseInt(ChildNode.length)==0)
 {
  return;
 }
 else
 {
  for(i=0;i<ChildNode.length;i++)
  {
   var cNode;
   cNode=ChildNode[i];
   cNode.setAttribute("Checked",Pchecked);
   //cNode.Checked = Pchecked;
   if(parseInt(cNode.getChildren().length)!=0)
   {
    setcheck(cNode,Pchecked);
   }
  }
 }
}

//设置子节点选中/取消;
//同时需要设置父节点的状态(如果是取消选中的话,仅仅设置本节点及其所有字接点,不涉及父接点)
function setParent(node,Pc)
{
    var parentNode = node.getParent();
 
    if(parentNode)
    {    
    
        var parentNodeFather = parentNode.getParent();
        
        if(parentNodeFather)
        {
            setParent(parentNode,Pc);
        }
        if(Pc)
            {parentNode.setAttribute("checked",Pc);}
        else
        {
            checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
        }
    }
}

//检查子接点是否有选择的,如果有一个选择了,那返回true
//只查第一级节点.
function checkBrother(parentNode,Pc,NodeData)
{
    var childNodes = new Array();
    childNodes = parentNode.getChildren();
    if(childNodes.length >0)
    {
        var bChecked = true;
        for(var i=0;i<childNodes.length;i++)
        {
            if(childNodes[i].getAttribute("checked") == true &&  childNodes[i].getAttribute("NodeData") != NodeData)
            {
                //alert(i+childNodes[i].getAttribute("Text"));
                bChecked = false;
                break;
            }
        }
        if(bChecked)
        {
            parentNode.setAttribute("checked",Pc);
        }
        else
        {
            //所有父结点选择
            setParent(parentNode,!Pc)
        }
    }
    else
    {
        parentNode.setAttribute("checked",Pc);
    }
}

//获取所有节点状态
function FindCheckedFromNode(node)
{
 var i = 0;
 var nodes = new Array();
 nodes = node.getChildren();
 
 for (i = 0; i <= nodes.length - 1; i++) 
 {
     if (nodes[i].getAttribute("Checked"))
     {
         AddChecked(nodes[i]);
     }
     if (parseInt(nodes[i].getChildren().length) != 0 )
     {
         FindCheckedFromNode(nodes[i]);
     }
 }
}
//添加选中节点
function AddChecked(node)
{
    document.all.checked.value += node.getAttribute("NodeData") + ",";
}

//-->
        </script>

这种方法有个很大的问题,就是他客户端设置的CheckBox在服务器端是不能获取的,现在只能在Check的时候遍历树,并把Checked的值放在一个文本里,然后提交到服务器,然后服务器来解析 1@2@这种字符
            现在我使用的是asp.net2.0,使用的是以下的方法

function public_GetParentByTagName(element, tagName) 
{
    var parent = element.parentNode;
    var upperTagName = tagName.toUpperCase();
    //如果这个元素还不是想要的tag就继续上溯
    while (parent && (parent.tagName.toUpperCase() != upperTagName)) 
    {
        parent = parent.parentNode ? parent.parentNode : parent.parentElement;
    }
    return parent;
}

//设置节点的父节点Cheched——该节点可访问,则他的父节点也必能访问
function setParentChecked(objNode)

    var objParentDiv = public_GetParentByTagName(objNode,"div");
    if(objParentDiv==null || objParentDiv == "undefined")
    {
        return;
    }
    var objID = objParentDiv.getAttribute("ID");
    objID = objID.substring(0,objID.indexOf("Nodes"));
    objID = objID+"CheckBox";
    var objParentCheckBox = document.getElementById(objID);
    if(objParentCheckBox==null || objParentCheckBox == "undefined")
    {
        return;
    } 
    if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "checkbox")
    return; 
    objParentCheckBox.checked = true;
    setParentChecked(objParentCheckBox);
}

//设置节点的子节点uncheched——该节点不可访问,则他的子节点也不能访问
function setChildUnChecked(divID)

    var objchild = divID.children;
    var count = objchild.length; 
    for(var i=0;i<objchild.length;i++)
    {
        var tempObj = objchild[i];
        if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
        {
            tempObj.checked = false;
        }
        setChildUnChecked(tempObj); 
    }
}

//设置节点的子节点cheched——该节点可以访问,则他的子节点也都能访问
function setChildChecked(divID)

    var objchild = divID.children;
    var count = objchild.length; 
    for(var i=0;i<objchild.length;i++)
    {
        var tempObj = objchild[i];
        if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
        {
            tempObj.checked = true;
        }
        setChildChecked(tempObj); 
    }
}

//触发事件
function CheckEvent()
{

    var objNode = event.srcElement; 

    if(objNode.tagName!="INPUT" || objNode.type!="checkbox")
    return;

    if(objNode.checked==true)
    {
        setParentChecked(objNode);
        var objID = objNode.getAttribute("ID");
        var objID = objID.substring(0,objID.indexOf("CheckBox")); 
        var objParentDiv = document.getElementById(objID+"Nodes");
        if(objParentDiv==null || objParentDiv == "undefined")
        {
            return;
        } 
        setChildChecked(objParentDiv);
    }
    else
    {
        var objID = objNode.getAttribute("ID");
        var objID = objID.substring(0,objID.indexOf("CheckBox")); 
        var objParentDiv = document.getElementById(objID+"Nodes");
        if(objParentDiv==null || objParentDiv == "undefined")
        {
            return;
        } 
        setChildUnChecked(objParentDiv);
    }
}

这种方法最大的好处就是服务端能得javascript设置的Checked的值,不用没点下就全部把树遍利下,直接在服务端遍利一次就行了

    //遍历子节点
    public void GetChildNode(TreeNode Node)
    {
        foreach (TreeNode node in Node.ChildNodes)
        {
            if (node.Checked)
            {
                StrChecked += node.Value+"@";
            }
            GetChildNode(node);
        }
    }
}

我照样能得到它的Check的值

asp.net 2.0 权限树的控制相关推荐

  1. ASP.NET 2.0站点登录、导航与权限管理

    (一)登录 asp.net 2.0中,新增了许多新的功能和控件.其中,新增的登陆控件可谓使得WEB应用的设计更加得心应手.什么是登陆控件呢?就是我们平常在WEB应用中经常要用到的用户注册,登陆,忘记密 ...

  2. 发布全部开源的Asp.net 2.0 RBAC 权限管理系统了,大家支持下。测试版发布: http://Wenzy.37live.com

    Asp.net RBAC membership framework For Visual Studio 2005 这里是基于Asp.net 2.0 membership机制的,根据RBAC权限管理规范 ...

  3. 发布全部开源的Asp.net 2.0 RBAC 权限管理系统了,大家支持下。

    在这里下载吧,域名被偷了,不好意思http://files.cnblogs.com/Wenzy/RMF1.0Beta20061003.rar Asp.net RBAC membership frame ...

  4. 在ASP.NET 2.0中建立站点导航层次

    站点导航提供程序--ASP.NET 2.0中的站点导航提供程序暴露了应用程序中的页面的导航信息,它允许你单独地定义站点的结构,而不用考虑页面的实际物理布局.默认的站点导航提供程序是基于XML的,但是你 ...

  5. ASP.NET 2.0 中的新增安全功能

    发布日期: 8/26/2004 | 更新日期: 8/26/2004 Stephen Walther Microsoft Corporation 适用于: Microsoft ASP.NET 2.0 M ...

  6. 一起谈.NET技术,ASP.NET MVC Membership 权限 漫谈

    以前一位同事习惯于使用Membership来进行权限管理,现在随着ASP.NET MVC的引入,采用以前的方法,提出了以下方案: ASP.NET MVC+Membership结合,通过在web.con ...

  7. ASP.NET 2.0应用程序安全强化纵览

    目前,实现Web开发的核心技术之一是ASP.NET 2.0.这种技术能够帮助企业快速开发出功能强大的Web应用程序,深受开发人员喜爱.然而,在开发人员实现业务逻辑的同时,由于各种原因的影响,应用程序的 ...

  8. (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)

    Web部件目录 我们已经见过了如何在 WebPartZones 控件中事先放入Web部件.你还可以用另外一种方法完成这个功能,那就是允许用户在运行时添加新的Web部件.通过使用 CatalogZone ...

  9. 一步步教你如何用疯狂.NET架构中的通用权限系统 -- 如何控制用户显示的菜单权限...

    菜单权限是我们经常会遇到的权限,也是经常需要进行处理的权限,往往权限是通过控制菜单权限开始折腾起来的. 第一步:我的后台管理控制端,有一个叫模块配置的功能,这里集中配置,哪些模块可以用,哪些模块先锁定 ...

最新文章

  1. 2015/6/2站立会议(补发)
  2. 汇编语言 ADC指令和SBB指令
  3. android scrollview 底部控件,Android ScrollView和屏幕底部的按钮
  4. 【script】python实现多线程将doc、docx转pdf,doc转docx
  5. (转)Visual C++开发工具与调试技巧整理
  6. android 华为 imei,华为手机怎么查看IMEI码?华为手机查询IMEI串号两种方法,华为imei...
  7. 决策树之CART 算法
  8. 人脸活体检测人脸识别:眨眼+张口
  9. Happy GroundHog Day土拨鼠之日
  10. 创造与魔法怎么自建服务器,创造与魔法自建服攻略大全_创造与魔法自建服建造方法、福利_玩游戏网...
  11. SQL宝典(中文版) 高清PDF版下载
  12. 【源码】30ms级 labview二维码实时 检测 识别
  13. 谷粒学院 01_在线教育行业介绍
  14. MAYA打造复古风书房一角场景模型-3D建模场景模型教程
  15. php empty 注意
  16. Android下雪动画的实现
  17. Photoshop新手学堂:ps消除锯齿在哪里
  18. 假发外贸如何获取流量?
  19. linux 如何把某个文件夹下的可执行文件全局使用
  20. 天池工业AI大赛-智能制造质量预测 比赛历程和技术方案总结复赛48名

热门文章

  1. 两个git库之间迁移_Python 3 迁移怨声载道
  2. linux中断共享程序实现,如何在非实时linux上实现实时应用程序与内核模块之间共享存储器...
  3. mysql 8.0 docker_Docker安装MySQL8.0的实现方法
  4. Python:KNN
  5. 和12岁小同志搞创客开发:Mind+编程软件简介、安装及使用
  6. 力扣(LeetCode)刷题,简单题(第22期)
  7. FPGA(2)基础语法 -- 按键控制led(alway@语句)
  8. android 音频增益_参考级音频播放器!七彩虹发布Pocket HIFI U6:4999亲民价
  9. Udacity机器人软件工程师课程笔记(四)-样本搜索和找回-基于漫游者号模拟器-决策树
  10. 解决uni-app ios唤起扫码操作,总是要刷新才可以唤起的问题