如何在.NET Core的主布局视图中呈现特定控制器的动作?

时间:2018-09-21 15:46:00

标签: c# asp.net-core asp.net-core-1.0

我正在从"TopNav"主视图中局部调用Layout

我希望对TopNav视图进行强类型输入,并希望在TopNavController中创建模型。

有什么方法可以从主视图中呈现特定控制器的动作?因此,在这种情况下,我需要在TopNav中渲染TopNavController的{​​{1}}动作。

到目前为止,我只能使用例如。 Layout@Html.Partial("TopNav")带有通过模型的选项,但我需要在控制器内实例化模型。

以前的版本中曾经有@Html.RenderPartial("TopNav")帮助器,但是.NET Core中似乎不再提供它。

1 个答案:

答案 0 :(得分:2)

关于为什么 @Html.Action(..)在GitHub问题Why was @Html.Action removed?中被删除的原因有很好的解释。

  

我们删除了它们是因为我们提出了一个整体更好的功能,称为“视图组件”。

基于该建议,很明显,您的示例的建议是创建一个View Component,按照惯例将其命名为TopNavViewComponent

ViewComponents / TopNavViewComponent.cs

public class TopNavViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
        // Code to instantiate the model class.
        var yourModelClass = ...

        return View(yourModelClass);
    }
}

View的调用会在已知位置查找Default.cshtml Razor文件。这是该文件的外观示例(其预期位置以粗体显示):

Shared / ViewComponents / TopNav / Default.cshtml

@model YourModelClassType

@*
    Your HTML, etc.
    Standard Razor syntax and HTML can be used here.
*@

为了使用这个新的View Component,您可以将以下内容添加到Layout视图中,以便在任何地方呈现输出:

Shared / _Layout.cshtml

@await Component.InvokeAsync("TopNav")

这应该足以让您开始使用View Components。还有一些其他有用的知识:

  1. View组件支持依赖项注入。
  2. 调用InvokeAsync时可以将参数传递到View组件中。

在这里,我将不介绍这两个功能,因为它们全部都包含在文档中,并且不在此问题的范围之内。