使用DTree树实现权限控制(权限的赋予、修改)---个人感觉蛮好用的
步骤一.引入DTree树编写后台方法:检查某个角色是否有某个功能、根据角色id批量删除权限、根据角色id批量插入权限
步骤二.在角色列表中的编辑的设置权限链接中,链接到修改角色权限修改页面ModifyRole.aspx,并且传入角色id;
步骤三.在修改页面设置如下:
前台:
<formid="frmRoleRight"action="ModifyRoleAction.aspx">
<divid="divTree"style="text-align:left;width:180px;"></div>
<asp:LiteralID="litTreeJS"runat="server"></asp:Literal>
<inputtype="hidden"id="hfRoleId"name="hiddenRoleId" runat="server"/>
</form>
其中:form表单中设置为提交到角色修改代码 编写页面ModifyRoleAction.asxp;Literal字段加载后台的js代码;隐藏字段则存放当前角色id.
后台:(应注意路径问题)
protectedvoidPage_Load(objectsender, EventArgse)
{
if (!IsPostBack)
{
stringid=GetRequestId();
inti_id;
if (!string.IsNullOrEmpty(id) &&int.TryParse(id, outi_id))
{
Models.Sys_rolerole=BLL.Sys_roleManager.GetSys_roleById(i_id);
if (role!=null)
{
litRoleName.Text=role.Role_name;
}
hfRoleId.Value=id;
}
litTreeJS.Text=string.Format("{0}<script type='text/javascript'>{1}</script>", GetTreeRelJsorCss(), GetTreeHeader() +GetTreeBody() +GetTreeFooter());
}
}
privatestringGetRequestId()
{
stringid=Request.QueryString["id"];
returnid;
}
//获取js树尾部
privatestringGetTreeFooter()
{
//将Dtree树添加到层divTree中
returnstring.Format("document.getElementById('{0}').innerHTML=tree;", "divTree");
}
//得到dtree js 的主体节点代码
privatestringGetTreeBody()
{
StringBuildersb=newStringBuilder();
//得到所以父节点
IList<Models.Sys_right>rights=BLL.Sys_rightManager.GetSysRoleRightOne();
foreach (Models.Sys_rightrightinrights)
{
intflag=BLL.Sys_role_rightManager.CheckRoleRight(int.Parse(GetRequestId()), right.Id) ==true?1 : 2;
sb.AppendFormat("tree.add('{0}','0','{1}','','','',{2},'{3}','{4}');", right.Id, right.Right_text, flag, BaseUrl() +"customerImg/CloseTree.gif", BaseUrl() +"customerImg/OpenTree.gif");
//根据父节点id添加子节点
sb.Append(GetSubRoleRight(right.Id));
}
returnsb.ToString();
}
//根据父节点id递归得到子节点
privatestringGetSubRoleRight(intparentId)
{
StringBuildersb=newStringBuilder();
//得到所以父节点
IList<Models.Sys_right>rights=BLL.Sys_rightManager.GetSysRoleRightByParentId(parentId.ToString());
foreach (Models.Sys_rightrightinrights)
{
//function Node(id, pid, name, url, title, target,flag, icon, iconOpen, open)
//flag:0代表无复选框,1代表有复选框且选中,2代表有复选框未选中
/*
* 这里查看某个角色有哪些功能,通过设置flag:
* 当flag=0时表示该角色没有该功能;
* 当flag=1时表示该角色有该功能。
*/
intflag=BLL.Sys_role_rightManager.CheckRoleRight(int.Parse(GetRequestId()),right.Id)==true?1:2;
sb.AppendFormat("tree.add('{0}','{1}','{2}','','','',{3},'{4}','{5}');", right.Id, parentId, right.Right_text, flag, BaseUrl() +"customerImg/CloseTree.gif",BaseUrl() +"customerImg/OpenTree.gif");
sb.Append( GetSubRoleRight(right.Id));
}
returnsb.ToString();
}
//获取js树头部
privatestringGetTreeHeader()
{
StringBuildersb=newStringBuilder();
sb.AppendFormat("tree=new dTree('tree','{0}');", BaseUrl());
//设置同一时间只能有一个节点展开
sb.Append("tree.config.closeSameLevel=true;");
//设置DTree树的根节点
sb.Append("tree.add('0','-1','MyHR','','','',2);");
returnsb.ToString();
}
//获取前台js引用或Css引用
privatestringGetTreeRelJsorCss()
{
stringjs=string.Format("<script type='text/javascript' src='{0}'></script>", BaseUrl() +"dtree.js");
stringCss=string.Format("<link href='{0}' rel='stylesheet' type='text/css' />", BaseUrl() +"dtree.css");
returnjs+Css;
}
//通用路径
privatestringBaseUrl()
{
return"http://www.cnblogs.com/../dtree/";
}
步骤四. 在角色修改代码 编写页面ModifyRoleAction.asxp进行代码编写:(要注意排除无意义的根节点)
protectedvoidPage_Load(objectsender, EventArgse)
{
//获取提交过来的角色id和权限ids
stringrightIds=Request.QueryString["right"];
stringroleId=Request.QueryString["hfRoleId"];
string[] rights=rightIds.Split(',');
IList<string>Rf_right_nos=newList<string>();
foreach(stringrightinrights)
{
//排除无意义的根节点,
if(right!="0")
Rf_right_nos.Add(right);
}
if (BLL.Sys_role_rightManager.ModifyRoleRight(int.Parse(roleId), Rf_right_nos))
{
Response.Redirect("sysRoleList.aspx");
}
else
{
Utility.Tool.Alert("修改权限失败!", this.Page);
}
}
posted on 2012-08-17 22:11 yxfaction 阅读(1438) 评论(0) 编辑 收藏 举报