Как отобразить действие конкретного контроллера в мастер-макете в .NET Core? - PullRequest
0 голосов
/ 21 сентября 2018

Я звоню "TopNav" частично из Layout основного представления.

Я хочу, чтобы представление TopNav было строго набрано, а модель создавалась в TopNavController.

* 1008.* Есть ли способ визуализировать действие определенного контроллера из основного представления?Так что в этом случае мне нужно сделать TopNav действие TopNavController в Layout.

Пока я могу использовать только например.@Html.Partial("TopNav") или @Html.RenderPartial("TopNav") с возможностью передать модель, но мне нужно создать экземпляр модели в контроллере.

Раньше был помощник Html.Action("Action", "Controller") в предыдущих версиях, но он не доступенбольше в .NET Core.

1 Ответ

0 голосов
/ 23 сентября 2018

Вот хорошее объяснение , почему @Html.Action(..) было удалено в проблеме GitHub здесь: Почему был удален @ Html.Action? .

Мы удалили их, потому что придумали, как нам показалось, общую улучшенную функцию под названием View Components.

Учитывая этот совет, ясно, что рекомендация для вашего примера будет заключаться в создании View.Компонент , который будет называться 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 Файл бритвы в известном месте.Вот пример того, как этот файл будет выглядеть (его предполагаемое расположение выделено жирным шрифтом):

Shared / ViewComponents / TopNav / Default.cshtml

@model YourModelClassType

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

InЧтобы использовать этот новый компонент представления, вы можете добавить следующее в Layout представление, где бы вы ни хотели, чтобы вывод выводился:

Shared / _Layout.cshtml

@await Component.InvokeAsync("TopNav")

Этого должно быть достаточно, чтобы начать работу с View Components.Несколько других полезных вещей:

  1. Компоненты представления поддерживают внедрение зависимостей.
  2. Аргументы могут быть переданы в компонент View при вызове InvokeAsync.
...