2024年6月2日发(作者:)
今天在做权限管理的时候对TreeView终于有所了解。在这里我所实现的是使用TreeView进
行权限分配
首先说一下TreeView的几个基本的属性
获取或设置treeviewd的标识符
dent 获取或设置TreeView控件子节点的缩进量,该量是以像素为单位的
获取TreeNode对象的集合(TreeNodeCollection)。该属性是只读的。
eckBoxex 是否显示复选框,有none,root,parent,leat,all五种,这里选择all
TreeNode:由于TreeView中的每一个节点都是一个TreeNode,所以事先也要对TreeNode有
所了解
TreeNode的一般属性
用于设置该节点保存的一个值,不显示
rl 该节点的图片路径
teUrl 该节点的链接地址
该节点显示的内容
分配资源页面:根据把所有的资源绑定到TreeView中,但由于为要进行分配资源的角色已
经拥有了部分资源,所以还要考虑到把该角色已经拥有的资源给选上钩。
数据库设计
sys_role 角色表
roleId 角色id
roleName 角色名称
sys_roleRight 角色-资源关系表
roleRightId
roleId 角色id
rightId 资源id
sys_right 资源表
rightId
node 节点
url 链接地址
image 图片地址
parentId 父节点id( parentId = 0表示该节点为根节点)
remark 文字描述
下面进入正题
一、进入分配资源页面
根据不同角色,选择分配资源链接。在链接中传入roleId标示所选择的角色,在
页面中获取该roleId,并把它存储在ViewState中。
//使用ViewState存储角色id
private string RoleId
{
get { return ng(ViewState["RoleId"]); }
set { ViewState["RoleId"] = value; }
}
在页面加载时获取roleId,并绑定TreeView
if (!IsPostBack)
{
string roleId = tring["roleId"];
if (!OrEmpty(roleId))
{
RoleId = roleId;
调用Sys_roleManager的方法通过RoleId获取该条角色信息
Sys_role role
Sys__roleByRoleId(32(RoleId));
+= me;
//通过RoleId查询Sys_roleRight表获取该角色的角色-资源关系集合
IList
Sys__roleRightsByRoleId(RoleId);
// 使用Linq检索roleRights集合获取该角色所拥有的资源,并把它所拥有
的资源存放到ViewState中
Role_RightId = (from right in roleRights select ng()).ToList();
}
//获取所有的根节点
IList
//绑定TreeView
BindTreeView(rights);
}
private IList
{
get{ return (IList
set{ViewState["Role_Right"] = value;}
}
二、绑定TreeView
上面说到使用BindTreeView(IList
就看一下对该方法的实现
BindTreeView(IList
放着所有的parentId=0的节点。
在该方法中我们会对该集合进行循环遍历,遍历到其中一项时调用BindChildre(int
parentId,TreeNode parentNode)方法绑定子节点
#region 一般绑定TreeView的方法
///
/// 绑定父节点
///
/// 所有为父节点的集合
public void BindTreeView(IList
{
//循环遍历父节点集合
foreach (var item in rights)
{
//创建父节点的TreeNode
TreeNode node = BindTreeNode(item);
roleRights =
=
if (Id == 0)
{
//判断该节点是否被拥有,如果拥有则被选中
if (role_ns(ng()))
{
d = true;
}
//判读如果该节点为根节点,就调用分配子节点的方法BindChildren(int
parentId,TreeNode parentNode)
BindChildren(d, node);
(node);
}
}
}
///
/// 绑定子节点的方法
///
/// 父节点id
/// 父节点TreeNode
private void BindChildren(int parentId, TreeNode parendNode)
{
// 获取该父节点的所有子节点
IList
//循环遍历所有的子节点
foreach (var item in childrenRight)
{
//创建子节点对象,通过BindTreeNode(Sys_right right)方法为子节点绑定数据
TreeNode childrenNode = BindTreeNode(item);
if (role_ns(ng()))
{
d = true;
}
//递归调用BindChildren(int parentId,TreeNode parentNode)方法,以绑定该节点
的所有子节点
BindChildren(d, childrenNode);
//把子节点添加到父节点中
(childrenNode);
}
}
#endregion
///
/// 为TreeNode绑定数据
///
///
///
private TreeNode BindTreeNode(Sys_right right)
{
TreeNode node = new TreeNode();
= ng();
if (!OrEmpty())
{
rl = "";
}
if (!(OrEmpty()))
{
//teUrl = ;
}
if (!(OrEmpty()))
{
= ;
}
return node;
}
三、分配资源
在分配资源页面中选择要分配资源右边的复选框,然后点击“确定按钮” 执行分配资源的
方法。
在执行方法时会判断所选择的资源是否以及被该角色所拥有,如果以及拥有则不需要进行添
加;除此之外还要判断该角色原来的资源有哪些要删除,把要删除的资源id存放到一个集
合中
内容如下
//获取所有选中的节点的集合,集合中存放TreeNode。集合的获取使用Cast<>对选
中的节点进行类型转换
IList
(
=
//使用linq获取newRoleRights集合中所有TreeNode的隐藏的value值,并把这些
value值存放到newRights集合中
IList
ng()).ToList();
= (from node in newRoleRights select
//要进行删除的资源id集合 使用Except获取交集
string[] deleteRightIds = role_(newRightIds).ToArray();
//要进行添加的资源id集合
string[] addRightIds = (role_RightId).ToArray();
if ( > 0)
{
//添加 角色-资源关系
Sys__roleRightByRole(RoleId, addRightIds);
}
if ( > 0)
{
//删除 角色-资源关系
Sys_Sys_roleRightByRoleId(RoleId, deleteRightIds);
}
发布评论