程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> asp.net 2.0權限樹的控制

asp.net 2.0權限樹的控制

編輯:關於ASP.NET

做權限的時候,主要實現如下功能

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") + ",";
}
//-->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved