我想将一些数据从数据库传递到主布局,我做了一个名为_Nav
的部分视图
@model IEnumerable<cms.Models.Page>
@foreach (var item in Model) {
<tr>
<td>
@item.Title
</td>
</tr>
}
它位于views/home
在HomeController
我有以下方法返回局部视图:
public IActionResult Pages()
{
return PartialView("_Nav", _context.Pages.ToList());
}
但是如何在主布局文件中显示它(我认为mvc 5中使用了@Html.Action
)?
答案 0 :(得分:0)
您应该创建一个用于渲染菜单的视图组件。
public class MenuViewComponent : ViewComponent
{
private readonly YourDbContext _context;
public MenuViewComponent(YourDbContext context)
{
_context= context;
}
public async Task<IViewComponentResult> InvokeAsync()
{
var items = await db.Pages.ToListAsync();
return View(items);
}
}
为Default.cshtml
目录中名为~/Shared/Components/Menu
的视图组件创建相应的剃刀视图。您可以在那里使用现有的视图代码。
@model List<Pages>
<table>
@foreach (var item in Model) {
<tr>
<td>
@item.Title
</td>
</tr>
}
</table>
现在您可以在布局中调用此视图组件
<div>
@await Component.InvokeAsync("Menu")
</div>
您也可以使用标记帮助器样式语法调用此视图组件。首先使用您的程序集名称添加~\Views\_ViewImports.cshtml
文件以调用addTagHelper
方法,以便可以在整个项目中使用我们的自定义标记帮助程序。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, YourProjectsAssemblyName
现在在布局中,
<vc:menu ></vc:menu>
答案 1 :(得分:0)
在views / home / index.cshtml文件中添加以下代码:
@Html.Action("Pages", "Home")
这将调用您的Pages方法,该方法将呈现HTML并将HTML返回到您的视图中。您处于正确的轨道上,但将其置于views / home / index.cshtml文件中将有助于使您的项目更有条理。