asp.net 2.0 权限树的控制

本文介绍了一种使用带CheckBox的树形结构实现权限管理的方法。通过客户端JavaScript实现了节点选中状态的联动,确保了若父节点被选中,则其所有子节点也被选中;反之亦然。文中详细解释了如何初始化节点的选中状态,并通过递归函数实现选中状态的传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做权限的时候,主要实现如下功能
            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)
ht
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值