您的位置:首页 > 编程语言 > ASP

asp.net 2.0 权限树的控制

2007-11-03 10:59 561 查看
asp.net 2.0 权限树的控制

            做权限的时候,主要实现如下功能
            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的值   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息