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返回本系列開篇