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

How to render action of specific controller in master Layout view in .NET Core?

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

我希望 TopNav 视图是强类型的,并希望在 TopNavController 中创建模型。

有什么方法可以从主视图中呈现特定控制器的动作吗?所以在这种情况下,我需要在 Layout.

中呈现 TopNavControllerTopNav 动作

到目前为止我只能使用例如。 @Html.Partial("TopNav")@Html.RenderPartial("TopNav") 可以选择传递模型,但我需要在控制器中实例化模型。

以前的版本中曾经有 Html.Action("Action", "Controller") 帮助程序,但在 .NET Core 中似乎不再可用。

@Html.Action(..) 在 GitHub 问题中被删除的原因有一个很好的解释:Why was @Html.Action removed?.

We removed them because we came up with what we felt was an overall better feature called View Components.

鉴于该建议,很明显,您的示例的建议是创建一个 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/Components/TopNav/Default.cshtml

@model YourModelClassType

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

要使用这个新的视图组件,请将以下内容添加到您的 Layout 视图中,无论您希望在何处呈现输出:

Shared/_Layout.cshtml

@await Component.InvokeAsync("TopNav")

这应该足以让您开始使用视图组件。其他一些有用的知识是:

  1. 视图组件支持依赖注入。
  2. 调用 InvokeAsync 时可以将参数传递给视图组件。

我不会在这里讨论这两个功能,因为它们都包含在文档中并且超出了这个问题的范围。