首页 > 解决方案 > 在 _Header 部分中,如何从 db 查询到呈现菜单?

问题描述

布局:

<partial name="_HeaderPartial" />
<div class="container">
    <main role="main" class="pb-3">
        @RenderBody()
    </main>
</div>
<partial name="_FooterPartial" />

_标题:

<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
    <div class="container">
        <a class="navbar-brand" asp-controller="Home" asp-action="Index">Admin</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
            <ul class="navbar-nav flex-grow-1">
                <li class="nav-item">
                    <a class="nav-link text-dark" asp-controller="Home" asp-action="Index">Home</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

现在我需要替换nav-item,每个页面路由和名称都来自数据库。由于标题部分没有特定的对应控制器。

那么我必须在每个控制器中添加 ViewBag 吗?像这样:

    public IActionResult Index() // page1
    {
        ViewBag.menus = _svc.getMenu(); 
        return View();
    }

    public IActionResult Thanks() // page2
    {
        ViewBag.menus = _svc.getMenu(); 
        return View();
    }

_标题

                @foreach (var menmu in ViewBag.menus)
                {
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-controller="@menmu.controller" asp-action="@menmu.action">@menmu.title</a>
                    </li>
                }

我的意思是我知道这样做是不对的,但我不知道什么是最好的解决方法。

标签: c#asp.net-coreasp.net-core-mvcrazor-pages.net-core-3.1

解决方案


我已按如下方式执行此操作(在 MVC5 应用程序中,您似乎正在使用 Razor Pages,因此对您而言可能有所不同,但我认为它仍然可以帮助您)

  1. 使用它自己的 Menu 模型类创建一个菜单局部视图。将菜单的标记放在那里
  2. 将 Menu() 方法添加到您的 HomeController(或其他控制器,并不重要),返回 PartialViewResult。我已将其标记为[ChildActionOnly]确保它只能用作局部视图。我还添加了[OutPutCache(Duration = 60)] 此方法将获取数据,创建模型并返回对PartialView("_Menu, menuModel)(或您命名的部分视图和模型的任何名称)的调用
  3. 在您的标题中,添加@Html.Action("Menu", "Home")以呈现菜单

推荐阅读