cshtml代码
@{
ViewBag.Title = "Grant";
string id = ViewBag.id;
}
<div id="tb" style="height:auto;position:absolute; left:10px; top:30px;" >
<a id="qd" class="easyui-linkbutton" data-options="iconCls:'icon-ok'" onclick="save()">确定</a>
<a id="qd" class="easyui-linkbutton" data-options="iconCls:'icon-undo'" onclick="javascript:$('#tt').tree('reload')">取消</a>
@*<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-search',plain:true" onclick="getChanges()">GetChanges</a>*@
</div>
<ul id="tt"></ul>
<script type="text/javascript">
$('#tt').tree({
url: '/Role/GetTree',
checkbox: true,
lines: true,
cascadeCheck: true,
onLoadSuccess:function(node,data){granted()},
});
function granted() {
$.ajax({
url: '/Role/Granted',
data: { roleId:@id },
dataType: 'json',
type: "POST",
async: false,
error: function (d) {
},
success: function (d) {
if(undefined!=d){
for(var i=0;i<d.length;i++){
var node = $('#tt').tree('find',d[i]);
$('#tt').tree('check',node.target);
}
}
}
})
}
function save() {
debugger;
var nodes = $('#tt').tree('getChecked','indeterminate');
var listNode = $('#tt').tree('getChecked')
if (listNode.length==0) {
utils.message('error','请选择权限!');
return;
}
var checkAllList = new Array();
for (var i = 0; i < listNode.length; i++) {
checkAllList.push(listNode[i]);
}
for (var i = 0; i < listNode.length; i++) {
var nodeArray = parentList(listNode[i].target);
if (nodeArray.length > 0) {
for (var j = 0; j < nodeArray.length; j++)
checkAllList.push(nodeArray[j])
}
}
checkAllList = outRepeat(checkAllList);
var idArray = new Array();
for (var i = 0; i < checkAllList.length; i++) {
idArray.push(checkAllList[i].id);
}
$.ajax({
url: '/Role/SaveGrant',
data: { roleId: @id,navListId: idArray },
dataType: 'json',
type: "POST",
async: true,
error:function(d){
utils.message('error', '保存失败!');
},
success: function (d) {
if (d == '保存成功') {
utils.message('success', d);
} else {
utils.message('error', d);
}
}
})
}
function parentList(target) {
var parentArray = new Array();
var node = parentNode(target);
while (undefined != node) {
parentArray.push(node);
node = parentNode(node.target);
}
return parentArray;
}
function parentNode(target) {
var node = $('#tt').tree('getParent', target);
return node;
}
function outRepeat(arr) {
var new_arr = new Array()
for (var i = 0; i < arr.length; i++) {
var items = arr[i];
if (!isArrayValueEqual(items, new_arr)) {
new_arr.push(items);
}
}
return new_arr;
}
function isArrayValueEqual(a, b) {
var is = false;
for (var i = 0; i < b.length; i++) {
is = isObjectValueEqual(a, b[i]);
if (is) {
return is;
}
}
return is;
}
function isObjectValueEqual(a, b) {
var is = a.id == b.id;
return is;
}
var nodes = $('#tt').tree('getChecked','indeterminate');
</script>
后台方法
public ActionResult Granted(string roleId) {
IList<Navigation> lists = new Navigation().FindAll<Navigation>();
List<string> navList = new List<string>();
if (null != roleId) {
Role role = new Role().FindById<Role>(roleId);
if (role.Navigations.Count > 0) {
foreach (Navigation item in role.Navigations) {
List<TreeNode> treelist = AllchildNode(item, lists);
if (null == treelist || treelist.Count == 0) {
navList.Add(item.BaseId);
}
}
}
}
return this.Json(navList);
}
public ActionResult SaveGrant(string roleId , List<string> navListId) {
string message = "保存成功";
try
{
Role role = new Role().FindById<Role>(roleId);
if (null != role && null != navListId)
{
role.Navigations = new HashSet<Navigation>();
role.Save();
foreach (string id in navListId)
{
Navigation nav = new Navigation().FindById<Navigation>(id);
if (null != nav)
{
role.Navigations.Add(nav);
}
}
role.Save();
}
}
catch (System.Exception e)
{
message = "保存失败";
}
return this.Json(message);
}
public ActionResult Grant(string id) {
ViewBag.id = id;
return View();
}
public ActionResult GetTree() {
IList<Navigation> top = new Navigation().GetRootNav();
List<TreeNode> treeGrid = new List<TreeNode>();
IList<Navigation> lists = new Navigation().FindAll<Navigation>();
foreach (Navigation na in top) {
TreeNode node = ObjectConvertNode(na,lists);
treeGrid.Add(node);
}
return Json(treeGrid);
}
private TreeNode ObjectConvertNode(Navigation na, IList<Navigation> lists) {
TreeNode node = new TreeNode();
node.id = na.BaseId;
node.text = na.Name;
node.children = AllchildNode(na,lists);
node.state = "open";
return node;
}
private List<TreeNode> AllchildNode(Navigation na, IList<Navigation> lists) {
List<Navigation> list = new List<Navigation>();
List<TreeNode> children = null;
List<Navigation> nalist = lists.Where(t => t.Parent == na).OrderBy(t => t.Sequence).ToList();
if (null != nalist && nalist.Count > 0) {
children = new List<TreeNode>();
foreach (Navigation navigation in nalist) {
TreeNode node= ObjectConvertNode(navigation, lists);
children.Add(node);
}
}
return children;
}