如何在 asp.net mvc 中使用主布局页面的 foreach 循环存储连接查询数据和检索数据

How to store join query data and retrieve using foreach loop from master layout page in asp.net mvc

我是 asp.net 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 循环从中检索数据。 这是我尝试检索但不起作用的视图页面。

查看页面:

  @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 登录 none 可以进入该站点,请举例说明以便我理解。提前致谢。

您的查询正在生成您无法在视图中访问的匿名对象的集合。创建一个包含您需要的属性的视图模型并将您的查询投影到其中,例如

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)
    {
        ....

但是,由于这是为了在布局中生成菜单,我建议您创建将代码移动到仅子操作的方法,该方法 returns 一个强类型的局部视图,例如 [=17] =]

[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。