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):用戶角色權限基本的實現說明
前言:這段時間博客的更新比較慢,主要是這段時間工作上面比較忙點,晚上回來在吹吹風,寫一點點的代碼就能休息了,所以用了這段時間把代碼基本寫完了,但是博客的更新速度比較慢,主要是后面的這部分內容感覺博客不好寫,一會在頁面,一會在控制器,一會又在Model中操作,感覺寫的亂而不識,雖然是這樣,但是我們還是要寫下去,給大家一個成型的東西才能感覺大完善,希望大家能夠理解,那么今天我們就開始說我們今天的內容,今天的內容主要有這幾個方向,(1):完善上篇博客中遺留的問題,(2):為用戶設置權限,這個的實現效果和上篇博客基本一樣,所以這里也就是基本提一下就行,(3):重新對頁面進行布局,實現Tab頁面。
1. 為用戶設置角色遺留問題—全局查詢
(1)上篇博客我們基本說完了為用戶設置角色,但是我們按照以前的代碼書寫的話發現了一個問題,那就是我們的用戶數據查詢不到了,這是什么原因呢?其實原因也很簡單,那就是用戶和角色是多對多的關系,當我們為用戶設置角色的話,用戶表中會存放角色表的實體,而角色表則會存放用戶表的實體,這個我們可以在Edmx模型中看到,那么為什么會這樣呢?原因就是當我們序列化BaseUser實體的時候,發現含有BaseRole屬性,這時候就要序列化BaseRole屬性,這時候EF提供了一個序列化導航屬性的時候的延遲加載起作用了,這樣的話他就會循環的去查詢BaseRole和BaseUser實體類,這樣序列化的話就會發生死循環,所以會報錯。
(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)通過上述的代碼實現我們就解決了我們前面提到我們遇到的問題,這里大家如果有什么不懂的話可以給我留言,可能我的預言表達能力不怎么好,只能表達到這里了。
2.為權限設置角色
(1)上述我們看到的這個標題大致的實現思路是固定的,因為我們在上一篇博客中已經介紹過了,為用戶設置角色,這幾個大的模塊的實現思路基本是一樣的,所以在這篇博客中我就不再介紹了,代碼我都已經寫完,希望大家可以參考上篇博客來實現這個功能。
(2)那么我們為什么給權限設置角色呢?看我們的Edmx模型其實大致就知道了,我這里簡單的說一下,為用戶設置角色,我們的角色中必然要對應於權限的操作,所有這樣就出現了我們要為權限設置角色。
(3)實現效果如圖所示:
3.EasyUI Tabs標簽頁面的實現
(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返回本系列開篇