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

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

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

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

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

最佳答案

有一个很好的解释,为什么在此处的Why was @Html.Action removed?的GitHub问题中删除了@Html.Action(..)


  之所以删除它们,是因为我们想到了一个更好的整体功能,即“视图组件”。


有了这些建议,很明显,您的示例的建议是创建一个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文件。这是该文件的外观示例(其预期位置以粗体显示):

共享的/ViewComponents/TopNav/Default.cshtml

@model YourModelClassType

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


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

共享的/_Layout.cshtml

@await Component.InvokeAsync("TopNav")


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


View组件支持依赖项注入。
调用InvokeAsync时,可以将参数传递给View组件。


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

10-01 21:55