c# - 在 _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>
}
我的意思是我知道这样做是不对的,但我不知道什么是最好的解决方法。
解决方案
我已按如下方式执行此操作(在 MVC5 应用程序中,您似乎正在使用 Razor Pages,因此对您而言可能有所不同,但我认为它仍然可以帮助您)
- 使用它自己的 Menu 模型类创建一个菜单局部视图。将菜单的标记放在那里
- 将 Menu() 方法添加到您的 HomeController(或其他控制器,并不重要),返回 PartialViewResult。我已将其标记为
[ChildActionOnly]
确保它只能用作局部视图。我还添加了[OutPutCache(Duration = 60)]
此方法将获取数据,创建模型并返回对PartialView("_Menu, menuModel)
(或您命名的部分视图和模型的任何名称)的调用 - 在您的标题中,添加
@Html.Action("Menu", "Home")
以呈现菜单
推荐阅读
- c++ - 调用布尔函数但收到错误“没有要调用的匹配函数”?
- abaqus - 如何在abaqus上将两个不同的部分分配给单个零件
- angular - Angular 7 自定义输入微调器
- git - 管道在 gitlab 合并请求上执行哪个分支?(合并的源/目标/结果)
- javascript - 如何使用 Javascriptexecutor 在没有 Id 作为定位器的元素中输入文本?
- deployment - 如何将 Travis 作业的 before_deploy/after_deploy 步骤配置为仅针对其中一个部署提供程序运行?
- css - 如何将样式属性添加到 react-sidenav
- javascript - 如何通过删除按钮删除插入的行
- c++ - 如何在 C++ 或一般代码中记住或存储函数(以及所有其他内容)?
- codeigniter - 当我使用查询生成器功能时,不显示错误消息