2018教程之mvc+ef + identity之七:角色权限系统菜单2菜单的全选择和写入
一、在前台实现读出来并能全选。
1.后台httget方法
/// <summary>
/// 菜单授权
/// </summary>
/// <param name="disposing"></param>
[HttpGet]
public ActionResult AuthorityMenu(string Id)
{
///读出所有的现有的菜单名称,以下拉框的形式写入。
//var menus = db.MenuInfos.Where(m => m.Popedomfatherid == 0).OrderBy(x => x.Sort);
///下面是开始显示菜单的列表了
///读出所有的菜单列表
var data = db.MenuInfos.ToList();
///定义一个变量result的MenuInfo列表变量
var result = new List<MenuInfo>();
///读出所有的一级菜单
var level0 = data.Where(m => m.Popedomfatherid == 0).ToList();
///当一级菜单索引选择有的时候,一级菜单就仅为我们选择的这个
///对所有一级菜单进行一次循环。 foreah (var xx in level0) 这种一样
level0.ForEach(item =>
{
///定义一个children字菜单变量,当他的Popedomfatherid=当前循环的ID,取出当前的所有字菜单
var children = data.Where(m => m.Popedomfatherid == item.Id).ToList();
///给子菜单名字前面加上几个---
children.ForEach(m => m.MenuName = "------------" + m.MenuName);
///为新定义的result变量增加一个 一级菜单
result.Add(item);
///为新定义的result变量增加一个 所有的字菜单
result.AddRange(children);
});
///ViewBag.list传值
ViewBag.List = result;
return View();
}
前台读出,注意有一个全选的按钮,
所有checkbox使用name=c,value=iD,就是菜单ID
@using MYtest2018.Models
@model MenuInfo
@{
ViewBag.Title = "AuthorityMenu";
Layout = "~/Views/Shared/_Layoutadmin.cshtml";
}
<div class="row wrapper border-bottom white-bg page-heading">
<div class="col-sm-4">
<h2>角色授权菜单</h2>
</div>
<div class="col-sm-8">
<div class="title-action">
</div>
</div>
</div>
<div class="wrapper wrapper-content animated fadeInRight">
@using (Html.BeginForm("AuthorityMenu", "Account", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="row">
<div class="col-lg-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h3>
操作:
<input type="checkbox" value="" id="check-all" /><label for="check-all">全选</label> | <input class="btn btn-primary" type="submit" value="确认授权" />
</h3>
</div>
<div class="ibox-content p-md">
@{
var data = ViewBag.List as List<MenuInfo>;
}
<div class="table-responsive">
<table class="table table-hover issue-tracker">
<tbody>
@if (data != null && data.Any())
{
foreach (var item in data)
{
<tr>
<td>
<input type="checkbox" name="c" value="@item.Id"/>
</td>
<td>
@item.Id
</td>
<td class="issue-info">
<i class="@item.MenuIcon"></i> @item.MenuName
</td>
<td>@item.ControllerName/@item.MethodName</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
}
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
<script>
$(function () {
$("#check-all").click(function () {
var checkedAll = $(this).prop("checked")
if (checkedAll) {
$("[name='c']").attr("checked", "checked");
} else {
$("[name='c']").removeAttr("checked");
}
})
})
</script>
}

二、实现角色ID和菜单ID的批量写入。
1.在角色列表处,加一个授权按钮,用于将ID送入这个POST方法

2.后 POST方法,注意要先删除该 角色ID包含的原有记录
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AuthorityMenu(string Id, List<string> c)
{
///如Id为null,返回错误请求
if (Id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
////删除包含有该角色Id的所有记录
//删除所有的数据,就是清空表原有数据
List<RoleMenu> xx = db.RoleMenus.Where(m=>m.RoleId==Id).ToList();
db.RoleMenus.RemoveRange(xx);
///将所有List C中的菜单ID与ROLEID一起写入表中
if (c != null) {
foreach (var id2 in c) {
RoleMenu roleMenu = new RoleMenu();
roleMenu.RoleId = Id;
roleMenu.MenuId = Convert.ToInt32(id2);
roleMenu.IsAvailable = 1;
db.RoleMenus.Add(roleMenu);
}
}
db.SaveChanges();
return View();
}

浙公网安备 33010602011771号