【问题标题】:How to render action of specific controller in master Layout view in .NET Core?如何在 .NET Core 的主布局视图中呈现特定控制器的操作?
【发布时间】:2020-05-07 22:38:27
【问题描述】:

我在 Layout 主视图中调用 "TopNav" partial。

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

有没有办法从主视图中呈现特定控制器的操作?所以在这种情况下,我需要在Layout 中渲染TopNavControllerTopNav 动作。

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

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

【问题讨论】:

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


    【解决方案1】:

    有一个很好的解释为什么@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/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")
    

    这应该足以让您开始使用 View Components。需要了解的其他一些有用的信息是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多