2016-08-17 14 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

相关问题