【问题标题】:Dynamic menu from database来自数据库的动态菜单
【发布时间】:2015-11-05 10:58:07
【问题描述】:

我有一个Login page,在登录时它会将用户带到Home Page,其中dynamic menu 已加载。问题是当用户单击menulink 之一时,loaded menu 不可见

这是因为我在Home controllerIndex action里面写了代码。

所以我的问题是我应该在哪里写 logic for dynamic menu 以便在单击菜单链接时可以访问它。

_Layout.cshtml 加载菜单的文件

 @model SMS.Models.ViewModel.DashboardVM

 @if (Model != null && Model.MenuParentList.Count > 0)
            {
                <!-- Sidebar Menu -->
                <ul class="sidebar-menu">
                    <li class="header">MAIN NAVIGATION</li>
                    <li class="active">
                        <a href="#">
                            <i class="fa fa-dashboard"></i> <span>Dashboard</span>
                        </a>
                    </li>
                    @foreach (var parentItem in Model.MenuParentList)
                    {
                        <li class="treeview">
                            <a href="#">
                                <i class="fa fa-th"></i>
                                <span>@parentItem.MenuParentName</span>
                                <i class="fa fa-angle-left pull-right"></i>
                            </a>
                            <ul class="treeview-menu">
                                @Html.Partial("_MenuParent", Model.MenuList.Where(x => x.ParentID == parentItem.MenuParentID))
                            </ul>
                        </li>
                    }                       

                </ul> 
            }      

动态菜单的逻辑在这里

 public ActionResult Index()
    {


            var _dashboardVM = new DashboardVM
            {
                User = _employee.Users.FirstOrDefault(),

                MenuParentList=_db.Menus
                                 .Where(x => _parentList.Contains(x.Id))
                                 .Select(x => new SMS.Models.ViewModel.DashboardVM.MenuParent
                                 {
                                     MenuParentID = x.Id,
                                     MenuParentName = x.MenuName
                                 })
                                 .OrderBy(x=>x.MenuParentID)
                                 .ToList(),
                MenuList=_employee.Designation.Role.MenuRoles
                                              .Select(x=>x.Menu)
                                              .ToList()

            };
     }

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    创建一个单独的 [ChildActionOnly] 方法来生成您的菜单并从布局页面调用它,以便它在所有页面中都可用

    [ChildActionOnly]
    public ActionResult Menu()
    {
      var model = new DashboardVM
      {
         ....
      }
      return PartialView("_Menu", model);
    }
    

    并创建一个_Menu.cshtml部分视图来生成html

    @model DashboardVM
    ....
    

    然后在您的布局中,删除@model SMS.Models.ViewModel.DashboardVM(布局不应有模型,除非该模型是布局使用的所有模型的基类),然后包含

    @Html.Action("Menu", yourControllerName)
    

    它将调用Menu 方法并将它返回的部分视图插入到布局中。

    【讨论】:

    • 感谢伙伴的大力支持。我从另一个stack overflow questionUsing ChildActionOnly in MVC了解更多关于ChildAction的信息。感谢StackOverflow帮助像我这样的新手。 :)
    • @ksg,帮不上那个忙。但恕我直言,这是一个糟糕的解决方案。如果您必须使用 Session,那么您应该始终检查服务器是否存在 Session 值,如果不存在,请再次从数据库中获取它。
    • 我同意你的观点,但是在超时之前延长会话有什么问题。最后,它为用户提供了良好的体验,而无需每次会话到期时都进入登录页面......
    • 什么意思进入登录页面。您不应该将会话用于登录/身份验证信息。那应该在FormsAuthentication cookie 中。
    • 请关注this question
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多