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>&nbsp;&nbsp;</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)-为用户设置角色的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建  ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列

    http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架 ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览  ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...

随机推荐

  1. web安全测试资料

    最近因为工作需要,整理了安全测试工具AppScan的一个教程.目录如下: 网上对于appscan的资料挺多,但是也很乱很杂.不利于系统的学习,这也是我为什么整理这样一份指导手册. 在这份手册里,主要包 ...

  2. 由于Replication,DBCC Shrink不能收缩Log File

    使用Backup创建测试环境之后,发现testdb的Log File过大,达到400GB,由于测试环境实际上不需要这么大的Log Space,占用400GB的Disk Space实在浪费Disk Re ...

  3. Android入门(二十一)解析XML

    原文链接:http://www.orlion.ga/685/ 解析XML常用的方式有两种,一种是PULL解析一种是SAX解析. 假设解析数据为: <apps>     <app> ...

  4. 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)

    微软在开发ASP.NET 5(当时被称为ASP.NET vNext)是采用的代号为Project K,所以运行时被称为KRuntime.KRuntime是一个SDK,它包含了编译和运行应用程序的所有资 ...

  5. 门外汉的IT

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机很早就走入了我的生活.小学时,家里放一台联想“天琴”的电脑.它霸气的音箱造型 ...

  6. Android自定义spinner下拉框实现的实现

    一:前言 本人参考博客:http://blog.csdn.net/jdsjlzx/article/details/41316417 最近在弄一个下拉框,发现Android自带的很难实现我的功能,于是去 ...

  7. BFC之清除浮动篇&clear

    我们在日常代码生活中,或多或少会利用浮动来布局,例如导航布局,如下图所示: 但是,我们在实现的时候,经常会遇到父元素“塌陷”以及清除浮动问题.例如 <!DOCTYPE html> < ...

  8. 从零开始编写自己的C#框架(10)——项目实施计划与甘特图

    不知不觉本系列已经写了一个月,编码前的各项工作到此也终于结束了.回头看看这一个月走过来,白天上班晚上码字查资料,写写改改,挺不容易的.很多时候有些知识会用,知道是怎么回事,但并不等于能写出来.错别字. ...

  9. 关于SubSonic3.0生成的表名自动加复数(s)的“用户代码未处理SqlException,对象名'xxxs'无效”异常处理

    使用SubSonic3.0模版生成时,同2.2版本一样,都会自动在一些类似数据库要用到的关键后面加要s(复数),这里也是3.0的一个小Bug,在查询时由于插件并没有完全的去掉s,所以会产生“用户代码未 ...

  10. 国内版Office 365和Azure AAD绑定的问题及解决方案

      背景: 1. 开发人员要做的事情,是希望在应用程序里面能调用Office 365 的API(Microsoft Graph)来动态添加Office 365账号 2. 如果需要调用这些API,必须在 ...