asp核心 - 将数据传递给主布局

时间:2018-06-13 19:39:53

标签: c# asp.net-mvc

我想将一些数据从数据库传递到主布局,我做了一个名为_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)?

2 个答案:

答案 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文件中将有助于使您的项目更有条理。