ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色
ASP.NET MVC+EF框架+EasyUI实现权限管系列
(开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装
(5):前台Jquery easyUI实现 (6):EF上下文实例管理 (7):DBSession的封装 (8):DBSession线程内唯一
(9):TT摸版的学习 (10):VSS源代码管理 (11):验证码实现和底层修改 (12):实现用户异步登录和T4模板
(13):权限设计 (14):主框架搭建 (15):权限数据库模型和用户登录详细错误 (16):用户注册的各种验证
(17):注册用户功能的细节处理 (18):过滤器的使用和批量删除数据(伪删除和直接删除)
(19):用户信息的修改和浏览 (20):多条件模糊查询和回收站还原的实现 (21):用户角色权限基本的实现说明
前言: 这个系列的博客已经半个月没写了,这半个月一直在忙其他的事情,这里对那些关注我项目进度的人说声对不起,让你们久等了,但是写到这里的话我们的项目已经基本差不多完成了,后面就剩下一少部分内容需要我们完善一下,现在开始我们继续将这个系列完成,争取能够在这个月月底之前完成,今天我们就要说一下为用户设置角色,因为我们是权限系统,所以每个用户都会对应的有相应的角色。
1.为用户设置角色
(1)在权限系统中,用户表和角色表本来就是多对多的关系,所以我们这里要为一个用户设置角色,和角色也可以对应的有多个用户,这里我们为用户设置角色的思路如下
(2)首先,我们为用户设置角色的话,添加一个设置角色的按钮,然后当我我们单击按钮的时候只能确定给一个用户设置角色,如果选择了多个的话则提示错误,然后我们就可以打开一个页面,页面上面则会循环显示出来所有的角色信息供用户选择,说到这里想必大家清楚了思路,那么请看实现的效果如图所示:

(3)如上图所示,就是我们给用户设置角色的页面,那么下面我们开始讨论它的实现思路以及主要的代码实现,下面我们开始说明这个的实现思路。
2.为用户设置角色页面实现
(1)首先我们实现当我们单击设置角色的时候只能选择一个选项并且弹出层的思路,这里我们使用另外一种弹出层的思路,也就是直接弹出一个页面而不是一个div,那么下面我们就详细的论述这个实现。
(2)首先我们添加一个设置角色的按钮,这个的代码就不写了,和以前的增删改查一样,然后在设置角色的代码中实现为用户设置角色的方法,SetUserRole(),
那么这个方法的代码如下所示(View层下面的UserInfo文件夹下的Index.cshtml):
1 //设置用户角色
function SetUserRole() {
var rows = $("#test").datagrid("getSelections");
if (rows.length != 1) {
$.messager.alert('提示消息', '必须选择一条用户信息!');
return;
}
//处理弹出设置角色的对话框
$("#DivSetUserRole").dialog('open').dialog('setTitle', '给用户设置角色');
//将弹出的框里面的东西设置到为用户设置角色的页面 frameSetRole
$("#frameSetRole").attr("src", "/UserInfo/SetRole/" + rows[0].ID);
}
<!------------------------设置用户角色信息---------------------------------->
<div id="DivSetUserRole" class="easyui-dialog" style="width:500px;height:380px;padding:10px 20px" closed="true"
resizable="true" modal="true">
<iframe id="frameSetRole" src="/welcome.html" scrolling="no" frameborder="0" width="100%" height="100%">
</iframe>
</div>
注释:上述代码中实现了提示我们只能选择一条信息,并且弹出层的信息,而且指向了我们的弹出层的路径的实现,
(3)从上面的指向我们可以看出src的属性指向了UserInfo控制器下面的SetRole方法,那么UserInfo控制器下面的SetRole方法的实现,代码中都详细的写了注释,我在这里就不再多说了,大家看看就都明白了,代码如下所示:
/// <summary>
/// 为用户设置角色
/// </summary>
/// <param name="ID">获取当前选择的用户的ID</param>
/// <returns>返回根据这个ID查到的用户信息</returns>
public ActionResult SetRole(int ID)
{
var currentSetRoleUser = _userInfoService.LoadEntities(c => c.ID == ID).FirstOrDefault();
//把当前要设置角色的用户传递到前台
ViewData.Model = currentSetRoleUser;
//前台需要所有的角色的信息,这时候我们就需要引用到所有的角色信息,便要定义角色类型
//得到枚举中的没有被删除的信息
int deleteNorMal = (int)DeletionStateCodeEnum.Normal;
var allRoles = _roleInfoService.LoadEntities(c => c.DeletionStateCode == deleteNorMal).ToList();
//动态的MVC特性,传递角色的全部信息
ViewBag.AllRoles = allRoles;
//往前台传递用户已经关联了的角色信息
ViewBag.ExtIsRoleIDS = (from r in currentSetRoleUser.R_UserInfo_Role //当前用户和角色中间表的集合数据
select r.RoleID).ToList();
return View();
}
(4).当我们实现了上述代码的时候,这时候我们就需要为SetRole方法添加视图,来显示我们查到的用户信息,角色信息,以及用户和角色的关联信息,那么添加视图的过程如下,首先我们在SetRole方法上面右键添加视图,然后在里面我们直接选择创建强类型的视图,选择一定的信息之后,如图所示:

(5).最后就会得到我们选择的这个用户的信息,但是因为这个只是简单的得到我们所传递到前台的用户的信息,所以这里我们还需要修改前台HTML的代码,得到用户信息,角色信息和用户角色的关系,然后使用MVC自带的发送异步请求的方法给后台发送设置角色的异步方法,如图所示:
<body>
<div>
<fieldset>
<legend>给用户:<font size="5px" color="blue">@Model.UserName </font>设置角色</legend>
@{
//设置角色发送异步请求
using(Ajax.BeginForm("SetRole","UserInfo",new AjaxOptions {OnSuccess="afterSetRole"},new {id="frmSetRole"}))
{
//隐藏域,用来给后台传递用户的ID
<input type="hidden" name="HideUserID" value="@Model.ID" />
var allRoles=(List<LYZJ.UserLimitMVC.Model.BaseRole>)ViewBag.AllRoles;
//那到前台传递过来的是否选中的数据
var extIsRoleIds=( List<int>)ViewBag.ExtIsRoleIDS;
for (int i = ; i < allRoles.Count; i++)
{
//拼接出来选中的ID传递到后台去
if(i==)
{
<br /><br />
}
string roleStr = "sru_" + allRoles[i].ID;
<!-- 判断当前角色有没有加入到当前用户里面去,如果加进去默认是选中,否则默认没选中 -->
if(extIsRoleIds.Contains(allRoles[i].ID))
{
<input type="checkbox" checked="checked" value="@roleStr" name="@roleStr" />
}
else
{
<input type="checkbox" name="@roleStr" value="@roleStr" />
}
<label for="@roleStr">@allRoles[i].Realname</label><span> </span>
}
<br /><br />
<div style="text-align:center;">
<input type="submit" value="设置角色" />
</div>
}
}
</fieldset>
</div>
</body>
(6)在上述代码中我们使用了MVC发送异步请求到控制器中去执行方法,所以我们需要引入MVC中执行异步请求的Jquery库,如下所示:
<!--添加发送异步请求到后台的引用,MVC实现-->
<script src="@Url.Content("~/Content/JqueryEasyUI/jquery-1.8..min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
<script type="text/javascript">
function afterSetRole() {
//调用父容器的一个方法,关闭对话框
window.parent.afterSetRole();
}
</script>
注解:在这里我们写了JavaScript中的方法afterSetRole,它调用了父容器中德afterSetRole方法,父容器是UserInfo控制器下面的Index.cshtml,代码如下:
//设置角色成功之后执行的方法
function afterSetRole() {
$.messager.alert("提示信息", "设置角色成功");
$("#DivSetUserRole").dialog('close');
}
(7).根据上面的HTML代码(SetRole.cshtml),我们使用了MVC封装的发送异步请求的方法给控制器(UserInfo控制器)发送了一个HTTPPost的SetRole方法来给用户设置角色,这里我们在控制器中的SetRole方法的代码如下:
1 /// <summary>
/// 给用户设置角色
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult SetRole()
{
//首先获取设置角色的用户ID,查询出用户的信息
int userID = Request["HideUserID"] == null ? : int.Parse(Request["HideUserID"]);
var currentSetUser = _userInfoService.LoadEntities(c => c.ID == userID).FirstOrDefault();
if (currentSetUser != null)
{
//给当前用户设置角色,从前台拿到所有的 角色 sru_3,从请求的表单里面拿到所有的以sru_开头的key。
//第一种方法
//foreach (var allKey in Request.Form.AllKeys)
//{
//}
//第二种写法
var allKeys = from key in Request.Form.AllKeys
where key.StartsWith("sru_")
select key;
//首先顶一个list集合存放传递过来的key,也就是角色的ID
List<int> roleIDs = new List<int>();
//循环将角色的ID加入到集合中
if (userID > )
{
foreach (var key in allKeys)
{
roleIDs.Add(int.Parse(key.Replace("sru_", "")));
}
}
_userInfoService.SetBaseUserRole(userID, roleIDs,Session["UserInfo"] as BaseUser);
}
return Content("OK");
}
(8).根据上述代码我们可以看到在上面代码中我们重写了一个方法SetBaseUserRole方法,这个方法的实现以及怎么书写我在前面都已经说过了类似的东西了,所以这里我只是贴出来它的实现代码,代码如下:
/// <summary>
/// 执行对用户设置角色的封装
/// </summary>
/// <param name="userID">用户ID</param>
/// <param name="roleIDs">角色集合的ID</param>
/// <param name="userInfo">传递过去用户登录的session</param>
/// <returns>返回是否执行成功的标志</returns>
public bool SetBaseUserRole(int userID, List<int> roleIDs, BaseUser userInfo)
{
//首先根据传递过来的userID判断用户是否存在
var currentUserInfo = _DbSession.BaseUserRepository.LoadEntities(c => c.ID == userID).FirstOrDefault();
if (currentUserInfo == null)
{
return false;
}
//首先获取到角色表中的所有信息返回
var listRoles = currentUserInfo.R_UserInfo_Role.ToList();
foreach (var t in listRoles)
{
_DbSession.R_User_RoleRepository.DeleteEntity(t);
}
//真正的删除了这个用户下面的所有的数据
_DbSession.SaveChanges();
//然后重新给这个用户赋予权限
foreach (var roleID in roleIDs)
{
//给用户批量插入角色,在中间表中,这里需要改成一个批量提交添加数据的
var rUserInfoRole = new R_User_Role
{
RoleID = roleID,
UserID = userID,
CreateOn = DateTime.Parse(DateTime.Now.ToString())
};
var user = userInfo;
rUserInfoRole.CreateUserID = user.Code;
rUserInfoRole.CreateBy = user.UserName;
_DbSession.R_User_RoleRepository.AddEntity(rUserInfoRole);
}
//执行真正的添加
_DbSession.SaveChanges();
return true;
}
3.为用户设置角色完成
(1)通过上述代码我们实现了为用户设置角色,虽然还有点小Bug,但是我们的功能基本都实现了,我们可以很容易的为用户设置角色,一些bug的修改我们在后面还会再次的说明,样例如图所示:

(2)如图所示,当我们单击确定之后可以实现设置角色,然后我们再次打开的时候角色已经设置成功,样子如上图所示。
4.小结
(1)这篇博客我们基本都在说明为用户设置角色的实现效果,文章写的稍微有点乱,大家如果对照代码看的话我觉得应该没什么难度,希望关注这个系统的朋友能够对我现在所实现的功能给出一些建议,我在这里谢谢大家了。
(2)另外为用户设置角色,为权限设置角色的实现效果一样,我也在这里就不多说如何为权限设置角色了。
(3)最后我们感谢大家的阅读,希望大家在以后的学习中能够更加的进步,谢谢大家了。
源码下载
(1):完整源码下载
Kencery返回本系列开篇
ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色的更多相关文章
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
随机推荐
- [大数据之Sqoop] —— 什么是Sqoop?
介绍 sqoop是一款用于hadoop和关系型数据库之间数据导入导出的工具.你可以通过sqoop把数据从数据库(比如mysql,oracle)导入到hdfs中:也可以把数据从hdfs中导出到关系型数据 ...
- python基础篇----字符串unicode
python中处理中文常要用到unicode,因为较容易遇到字符串编码的问题,我一般都是将字符串统一转成unicode去处理 python中定义一个unicode字符串,可以在字符串前面加u: str ...
- 一起学微软Power BI系列-官方文档-入门指南(5)探索数据奥秘
我们几篇系列文章中,我们介绍了官方入门文档与获取数据等基本知识.今天继续给大家另外一个重点,探索数据奥秘.有了数据源,有了模型,下一步就是如何解析数据了.解析数据的过程需要很多综合技能,不仅仅是需要掌 ...
- C语言之通过冒泡排序浅谈编程思想
写这篇博文的目的是想起到抛砖引玉的作用,还请大牛们留下一些先进的思想,让小菜学习一下.下面入正题. 复习C语言怎么能少的了冒泡呢,记得刚学C语言那会,感觉冒泡排序真的太复杂了,理解不大了,嗯!还是当时 ...
- 关于Docker目录挂载的总结
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定. 譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定: # docker ...
- Lua 学习笔记(十一)元表与元方法
在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符 ...
- geotrellis使用(五)使用scala操作Accumulo
要想搞明白Geotrellis的数据处理情况,首先要弄清楚数据的存放,Geotrellis将数据存放在Accumulo中. Accumulo是一个分布式的Key Value型NOSQL数据库,官网为( ...
- iOS 如何自定义UISearchBar 中textField的高度
iOS 如何自定义UISearchBar 中textField的高度 只需设置下边的方法就可以 [_searchBar setSearchFieldBackgroundImage:[UIImage i ...
- css截断长文本显示
实现 截断长文本显示处理,以前是通过后台的截取,但这种方法容易丢失数据,不利于SEO. 而通过前端css的截断,则灵活多变,可统一运用与整个网站. 这项技术主要运用了text-overflow属性,这 ...
- 使用Jquery的Ajax实现无刷新更新,修改,删除页面
本文将向大家讲述一下最近工作的一些总结,主要包括了以下内容,注册界面以及详细信息界面的编辑.主要是介绍了AJAX技术,因为我觉得其他方面没什么好介绍的.首先是跟大家说一下Ajax的优点,假如你删除了一 ...