ASP.NET MVC+EF框架+EasyUI实现权限管系列html
(开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 web
(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):用户角色权限基本的实现说明异步
前言:这段时间博客的更新比较慢,主要是这段时间工做上面比较忙点,晚上回来在吹吹风,写一点点的代码就能休息了,因此用了这段时间把代码基本写完了,可是博客的更新速度比较慢,主要是后面的这部份内容感受博客很差写,一会在页面,一会在控制器,一会又在Model中操做,感受写的乱而不识,虽然是这样,可是咱们仍是要写下去,给你们一个成型的东西才能感受大完善,但愿你们可以理解,那么今天咱们就开始说咱们今天的内容,今天的内容主要有这几个方向,(1):完善上篇博客中遗留的问题,(2):为用户设置权限,这个的实现效果和上篇博客基本同样,因此这里也就是基本提一下就行,(3):从新对页面进行布局,实现Tab页面。学习
(1)上篇博客咱们基本说完了为用户设置角色,可是咱们按照之前的代码书写的话发现了一个问题,那就是咱们的用户数据查询不到了,这是什么缘由呢?其实缘由也很简单,那就是用户和角色是多对多的关系,当咱们为用户设置角色的话,用户表中会存放角色表的实体,而角色表则会存放用户表的实体,这个咱们能够在Edmx模型中看到,那么为何会这样呢?缘由就是当咱们序列化BaseUser实体的时候,发现含有BaseRole属性,这时候就要序列化BaseRole属性,这时候EF提供了一个序列化导航属性的时候的延迟加载起做用了,这样的话他就会循环的去查询BaseRole和BaseUser实体类,这样序列化的话就会发生死循环,因此会报错。ui
(2)根据上面咱们也知道了之前的代码会出现错误,那么咱们怎么避免这个错误,使咱们的用户显示出来数据呢?其实咱们只须要用linq将BaseUser字段所有查询出来便可,最后对用户的控制器查询效果修改以后的代码以下所示:
1 /// <summary> 2 3 /// 获取全部的用户信息 4 5 /// </summary> 6 7 /// <returns>返回用户详细信息的Json对象</returns> 8 9 public ActionResult GetAllUserInfos() 10 11 { 12 13 //Json格式的要求{total:22,rows:{}} 14 15 16 17 //实现对用户分页的查询,rows:一共多少条,page:请求的当前第几页 18 19 int pageIndex = Request["page"] == null ? 1 : int.Parse(Request["page"]); 20 21 int pageSize = Request["rows"] == null ? 10 : int.Parse(Request["rows"]); 22 23 //获得多条件查询的参数 24 25 string RealName = Request["RealName"]; 26 27 string Telephone = Request["Telephone"]; 28 29 string EMail = Request["EMail"]; 30 31 int? Enabled = Request["Enabled"] == null ? -1 : int.Parse(Request["Enabled"]); 32 33 string AuditStatus = Request["AuditStatus"]; 34 35 int? DeletionStateCode = Request["DeletionStateCode"] == null ? 0 : int.Parse(Request["DeletionStateCode"]); 36 37 int total = 0; 38 39 //调用分页的方法,传递参数,拿到分页以后的数据 40 41 //var data = _userInfoService.LoadPageEntities(pageIndex, pageSize, out total, 42 43 // u => true && u.DeletionStateCode == 0, true, u => u.SortCode); 44 45 //封装一个业务逻辑层的方法,来处理分页过滤事件 46 47 var userInfoQuery = new UserInfoQuery() 48 49 { 50 51 PageSize = pageSize, 52 53 PageIndex = pageIndex, 54 55 RealName = RealName, 56 57 Telephone = Telephone, 58 59 EMail = EMail, 60 61 Enabled = Enabled, 62 63 AuditStatus = AuditStatus, 64 65 Total = 0, 66 67 DeletionStateCod = DeletionStateCode 68 69 }; 70 71 //若是含有导航属性关联的话,出现循环引用的问题,死循环 72 73 var data = from u in _userInfoService.LoadSearchData(userInfoQuery) 74 75 select new 76 77 { 78 79 u.ID,u.AuditStatus,u.Birthday,u.ChangePasswordDate,u.Code,u.CreateBy,u.CreateOn,u.CreateUserID,u.DeletionStateCode,u.DepartmentID,u.Description,u.Email,u.Enabled,u.Gender,u.HomeAddress,u.IsStaff,u.IsVisible,u.Mobile,u.ModifiedBy,u.ModifiedUserID,u.ModifirdOn,u.QICQ,u.QuickQuery,u.RealName,u.SecurityLevel,u.SortCode,u.Telephone,u.Title,u.UserFrom,u.UserName,u.UserPassword 80 81 }; 82 83 //构形成Json的格式传递 84 85 var result = new { total = userInfoQuery.Total, rows = data }; 86 87 //return JsonDate(result); 88 89 return Json(result, JsonRequestBehavior.AllowGet); 90 91 }
(3)经过上述的代码实现咱们就解决了咱们前面提到咱们遇到的问题,这里你们若是有什么不懂的话能够给我留言,可能个人预言表达能力不怎么好,只能表达到这里了。
(1)上述咱们看到的这个标题大体的实现思路是固定的,由于咱们在上一篇博客中已经介绍过了,为用户设置角色,这几个大的模块的实现思路基本是同样的,因此在这篇博客中我就再也不介绍了,代码我都已经写完,但愿你们能够参考上篇博客来实现这个功能。
(2)那么咱们为何给权限设置角色呢?看咱们的Edmx模型其实大体就知道了,我这里简单的说一下,为用户设置角色,咱们的角色中必然要对应于权限的操做,全部这样就出现了咱们要为权限设置角色。
(3)实现效果如图所示:
(1)在说这个的使用以前咱们首先看一下咱们之前的前台页面的架构,如图所示:
(2)那么看咱们如今项目的前台页面的架构,咱们能够发现咱们引入了EasyUI Tabs以后的变化,如图所示:
(3)EasyUI Tabs控件实现了,可是在这里咱们就会遇到当咱们重复单击右边的导航的时候会发生什么变化,那么主要的代码以下:
1 //绑定菜单按钮的点击事件 MenuLink 2 3 function BindMenuClickEvent() { 4 5 $(".MenuLink").click(function () { 6 7 //获取按钮里面的src属性 8 9 var src = $(this).attr("src"); 10 11 //将主框架的iframe跳转到菜单指向的地址 12 13 //$("#frmWorkArea").attr("src", src); 14 15 //获得节点的名字来放去Title 16 17 var title = $(this).text(); 18 19 //拼接一个Iframe标签 20 21 var str = '<iframe id="frmWorkArea" width="100%" height="100%" frameborder="0" scrolling="yes" src="' + $(this).attr("src") + '"></iframe>' 22 23 //首先判断用户是否已经单击了此项,若是单击了直接获取焦点,负责打开 24 25 var isExist = $("#worktab").tabs('exists', title); 26 27 if (!isExist) { 28 29 //添加tab的节点,调用easyUITab标签的方法 30 31 $("#worktab").tabs('add', { 32 33 title: title, 34 35 content: str, 36 37 iconCls: 'icon-save', 38 39 closable: true 40 41 }); 42 43 } 44 45 else { 46 47 //若是存在则获取焦点 48 49 $("#worktab").tabs('select', title); 50 51 } 52 53 }); 54 55 }
4.这篇博客到这里基本就已经写完了,你们阅读的时候若是有什么问题能够给我留言,我将会在第一时间回复,这篇博客你们看起来可能有点吃力,由于不连贯,因此你们可以看看前面的博客在看这篇博客的时候将会很顺心的,那么下篇博客咱们开始讲述权限组的实现。
(1):完整源码下载
Kencery返回本系列开篇