我正在从"TopNav"
主视图中调用Layout
部分。
我希望强类型化TopNav
视图,并希望在TopNavController
中创建模型。
有什么方法可以从主视图中呈现特定控制器的动作?因此,在这种情况下,我需要在TopNav
中呈现TopNavController
的Layout
操作。
到目前为止,我只能使用例如。 @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组件。我不会在这里介绍这两个功能,因为它们全部都包含在文档中,并且不在此问题的范围之内。