今天是:
首 页信息查询网站SEO查询工具CSS编辑器建站素材
网海拾贝,电脑资讯,电脑快报,it资讯,网站建设资讯,教程基地
软件新闻
操作系统
Vista Winxp Win2003 Linux Windows综合
工具软件
系统工具 媒体工具 网络工具 杀毒软件 聊天
软件开发
C教程 C++ Java C# ASP.NET JSP PHP
数据库
Oracle MySQL DB2 SQL Server Sybase
安全
网络 病毒
办公应用
Word Excel Powerpoint Outlook 其他
平面设计
Photoshop Fireworks Coreldraw Flash Illustrator 3dsmax
网站运营
网站运营 网站优化 网站策划 策划书下载 建站心得 站长故事 网站盈利 网页制作 网页特效 建站素材 免费资源 QQ频道
  当前位置:首 页 >> 软件开发 >> ASP.NET教程 >> asp.net 2.0 权限树的控制

asp.net 2.0 权限树的控制

  发布于2008-01-24 15:16 来源:网海拾贝

做权限的时候,主要实现如下功能

 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)