2016-08-17 38 views
0

我是新的asp.net mvc。我正在嘗試在視圖頁面中構建角色明智的動態菜單顯示。每個用戶可以有多個角色。 我有這樣一個連接查詢:如何存儲連接查詢數據,並從asp.net中的主佈局頁面檢索使用foreach循環mvc

我的控制器看起來像連接查詢:

var query= (from rMPageMap in db.RoleModulePageMaps 
           join userRole in db.UserRoleMaps 
           on rMPageMap.RoleId equals 
           join roleMaster in db.RoleMasters 
           on rMPageMap.RoleId equals roleMaster.Id 
           join modMaster in db.ModuleMaster 
           on rMPageMap.ModuleId equals modMaster.Id 
           join sModMaster in db.SubModuleMasters 
          on rMPageMap.SubModuleId equals sModMaster.Id 
           join pMaster in db.PageMasters 
           on rMPageMap.PageId equals pMaster.Id 
           where (userRole.UserId == appuser.Id &) 
           select new 
           { 

            rMPageMap.RoleId, 
            rMPageMap.PageMaster.Name, 
            roleMaster.Id, 
            roleName = roleMaster.Name, 
            modId = modMaster.Id, 
            moduleName = modMaster.Name, 
            subModuleId = sModMaster.Id, 
            subModuleName = sModMaster.Name, 
            pageId = pMaster.Id, 
            pageName = pMaster.Name, 
            parentPageId = pMaster.ParentPageId, 
            rMPageMap.AddData, 
            rMPageMap.EditData, 
            rMPageMap.ViewData, 
            rMPageMap.DeleteData, 
            rMPageMap.ShowInDashBoard, 
            rMPageMap.ShowInMenu 
           }); 
Session["rolemodulepage"] = query; 

我發現在會話中的值,而調試。但我無法從佈局頁面中使用foreach循環檢索數據。 這是我查看頁面,我嘗試ro檢索,但不起作用。

查看頁:

@if (Request.IsAuthenticated) 
    { 
    var sessionVar = System.Web.HttpContext.Current.Session["rolemodulepage"]; 

    foreach(var i in sessionVar) // error 
    { 
     @i.... // error 
    } 
// So here how to retrieve data from session using foreach loop. I tried but does not work. Pls help. If you have some resource for dynamically mane show in view page pls share with me. 

誰能解釋如何做到這一點使用表示通過主頁面佈局基於角色的用戶動態菜單。 Wihout登錄無法進入該網站,請用例子解釋,以便我能理解。提前致謝。

+0

您將生成一個不能在視圖中使用的匿名對象的集合。創建一個視圖模型並將該模型傳遞給視圖。 –

+0

你能幫我嗎?怎麼做?或任何提示.. – user267019

+0

創建一個類與每個屬性,並使用'選擇新的yourModel {RoleId = rMPageMap.RoleId,.....'等(您的模型將'IEnumerable ') –

回答

1

您的查詢正在生成您無法在視圖中訪問的匿名對象的集合。創建一個包含你需要和項目查詢到它的屬性視圖模型,例如

public class MenuVM 
{ 
    public int RoleId { get; set; } 
    public string PageMasterName { get; set; } 
    .... 
} 

,然後修改查詢

var query = (from rMPageMap in db.RoleModulePageMaps 
      .... 
      where (userRole.UserId == appuser.Id &) 
      select(new MenuVM() 
      { 
       RoleId = rMPageMap.RoleId, 
       PageMasterName = rMPageMap.PageMaster.Name, 
       .... 
      }).AsEnumerable() 

;

,然後在視圖中,您可以通過它投的Session值和循環

var sessionVar = HttpContext.Current.Session["rolemodulepage"] as IEnumerable<MenuVM>; 
if (sessionVar null) 
{ 
    foreach(var i in sessionVar) 
    { 
     .... 

然而,因爲這是在佈局產生一個菜單,我建議你創建代碼移動到一個孩子的行動僅在發言權CommonController

[ChildActionOnly] 
public PartialViewResult Menu() 
{ 
    if (!Request.IsAuthenticated) 
    { 
     return null; 
    } 
    // Check if the session variable exists and if not, generate the query 
    // and add the result to session 
    return PartialView("_Menu", query); 
} 

返回強類型局部視圖,例如和_Menu.cshtml視圖將是方法

@model IEnumerable<MenuVM> 
@foreach (var i in Model) 
{ 
    .... 
} 

,並在佈局,使用

@{ Html.RenderAction("Menu", "Common"); } 

來生成菜單的HTML。

+0

非常感謝@Stephen Mueche,我嘗試過的第一種方式,效果很好,我將以第二種方式應用.....再次感謝...... – user267019

相關問題