我正在从"TopNav"
主视图中局部调用Layout
。
我希望对TopNav
视图进行强类型输入,并希望在TopNavController
中创建模型。
有什么方法可以从主视图中呈现特定控制器的动作?因此,在这种情况下,我需要在TopNav
中渲染TopNavController
的{{1}}动作。
到目前为止,我只能使用例如。 Layout
或@Html.Partial("TopNav")
带有通过模型的选项,但我需要在控制器内实例化模型。
以前的版本中曾经有@Html.RenderPartial("TopNav")
帮助器,但是.NET Core中似乎不再提供它。
答案 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。还有一些其他有用的知识:
InvokeAsync
时可以将参数传递到View组件中。在这里,我将不介绍这两个功能,因为它们全部都包含在文档中,并且不在此问题的范围之内。