Условно вызвать ViewComponent внутри Razor Page - PullRequest
0 голосов
/ 10 ноября 2018

Я новичок в Razor Pages и View Components, и я не могу разобраться с концепциями:

У меня есть Example page, эта страница отображается внутри _Layout,например:

@page "{value1?}/{value2?}"
@model MyProject.Pages.ExampleModel
@{
    ViewData["Title"] = "Example";
}

Теперь мне нужно вызвать ViewComponent условно на основе value1 и value2:

public class ExampleModel : PageModel
{
    public async Task<IActionResult> OnGetAsync(string value1, string value2)
    {
        // this contains a lot of logic, db access etc, and passing objects to the component, but I'm abbreviating

        if (value1 == null && value2 == null)
        {
            return this.ViewComponent(nameof(SomeComponent));
        }
        else
        {
            return this.ViewComponent(nameof(SomeOtherComponent));
        }

        // return Page();
    }
}

Это расширение, которое я использую для вызовакомпоненты:

public static class PageModelExtensions
{
    public static ViewComponentResult ViewComponent(this PageModel pageModel, string componentName, object arguments)
    {
        return new ViewComponentResult
        {
            ViewComponentName = componentName,
            Arguments = arguments,
            ViewData = pageModel.ViewData,
            TempData = pageModel.TempData
        };
    }
}

Это работает, но поскольку я не вызываю return Page(), компонент отображается без вызова _Layout.Как мне подойти к этому?

1 Ответ

0 голосов
/ 10 ноября 2018

Если вы хотите визуализировать View-компонент из Razor Page, как это, один из вариантов - указать имя указанного View-компонента в вашем PageModel классе, а затем использовать Component.InvokeAsync в Соответствующий .cshtml файл. Вот как это может выглядеть:

Example.cshtml.cs

public class ExampleModel : PageModel
{
    public string ViewComponentName { get; set; }

    public async Task<IActionResult> OnGetAsync(string value1, string value2)
    {
        ...

        if (value1 == null && value2 == null)
            ViewComponentName = nameof(SomeComponent);
        else
            ViewComponentName = nameof(SomeOtherComponent);

        return Page();
    }
}

Example.cshtml

@page "{value1?}/{value2?}"
@model MyProject.Pages.ExampleModel

...

@await Component.InvokeAsync(Model.ViewComponentName)

В Example.cshtml.cs ViewComponentName - это новое свойство, которое (что неудивительно) представляет имя компонента View, которое должно отображаться как часть страницы, что реализовано в Example.cshtml с использованием Component.InvokeAsync.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...