Как искать пути к компонентам Razor Page View? Я не могу заставить их работать, .NET Core пытается включить нерелевантную модель - PullRequest
0 голосов
/ 10 мая 2018

Я не могу включить ViewComponent на страницу.

У меня есть структура папок: - Pages - Components - ExternalSystems - Default.cshtml - Views - Shared - Components - ExternalSystems - Default.cshtml

Файл класса

public class Default : ViewComponent
{
    private readonly Models.PermissionRegisterContext _context;

    public Default(Models.PermissionRegisterContext context)
    {
        _context = context;
    }


    public async Task<IViewComponentResult> InvokeAsync()
    {
        var externalSystems = await _context.ExternalSystem.ToListAsync();

        return View("Default", externalSystems);
    }
}

в Pages/Index.cshtml Я пытался включить этот компонент методом проб и ошибок (в конце концов, я изучаю этот материал): @await Component.InvokeAsync("ExternalSystems"); @await Component.InvokeAsync("/Pages/Components/ExternalSystems"); @await Component.InvokeAsync("/Pages/Components/ExternalSystems/Default"); @await Component.InvokeAsync("/Pages/Components/ExternalSystems/Default.cshtml"); @await Component.InvokeAsync("/Views/Shared/ExternalSystems");

Я ожидал, что исключение покажет места, в которых выполняется поиск, как и для @Html.Partial:

InvalidOperationException: частичное представление 'none' не найдено. Были найдены следующие местоположения: /Pages/none.cshtml /Views/Shared/none.cshtml

Однако для каждого отдельного вызова на @await Component.InvokeAsync оно выдает это исключение:

InvalidOperationException: Не удалось найти метод Invoke или InvokeAsync для компонента представления .Pages.Identities.IndexModel.

Прежде всего, он не показывает мне искомые пути. Во-вторых, ждать что? Почему вы говорите мне что-то о Pages.Identities? Да, у меня есть эта модель, но она нигде не указана ни в Pages/Index.cshtml, ни в представлении компонента, который я пытаюсь включить.

Может ли кто-нибудь дать мне руководство, чтобы определить: как искать пути к компонентам? Для Razor Pages это не задокументировано , только на стороннем сайте . В любом случае, у меня так не получится - каковы будут этапы отладки? Консольная отладка не показывает ничего полезного.

dotnet 2.0.7

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Хорошо, моя ошибка состояла в том, что я не видел, что я украсил ...Pages.Identities.IndexModel [ViewComponent]. Он был непреднамеренным и просто пытался заставить ViewComponents работать методом проб и ошибок и не смог увидеть эту ошибку.

По сути, обнаружен тип dotnet, у которого не было ни функции Invoke / InvokeAsync, и, следовательно, он застрял в этом исключении.

Я проверил, что эти пути ищутся при предоставлении «HelloWorld» в качестве имени представления:

  • / Страницы / Компоненты / HelloWorld / HelloWorld.cshtml
  • / Views / Shared / Компоненты / HelloWorld / HelloWorld.cshtml
0 голосов
/ 10 мая 2018

Допустим, вы создали компонент вида следующим образом:

public class ExternalSystems : ViewComponent 
{  

    public ExternalSystems()
    {
      //constructor can have dependencies injected. 
    }     

    public IViewComponentResult Invoke() 
    {
       //View is a helper method available in classes inherited
       //from ViewComponent that returns an instance of 
       //ViewViewComponentResult. It has multiple overloads as described 
       //later.
       return View(viewName,viewModel);           
    }
}

Метод представления имеет несколько переопределений:

  View() - use default view for view component without any viewmodel
  View(viewModel) - use default view for view  component with specified viewmodel
  View(viewName) - use specified view for view component without any viewmodel
  View(viewName,viewModel) - use specified view for view component with specified viewmodel

Когда вы пытаетесь визуализировать этот компонент вида из контроллера, представление будет просматриваться в следующих местах:

  1. " / Views / {ControllerName} / Components / ExternalSystems / {ViewName} .cshtml ".
    Итак, если вы используете HomeController и указали viewName как ExternalSystemsView в вызове View (viewName, viewModel), ваш путь становится /Views/Home/Components/ExternalSystems/ExternalSystemsView.cshtml. Это позволяет каждому контроллеру иметь свой собственный вид для представления, возвращаемого компонентом вида.

  2. Если файл ExternalSystemsView.cshtml не находится по указанному выше пути, он будет просмотрен по адресу / Представления / Общие / Компоненты / ExternalSystems / ExternalSystemsView.cshtml

  3. Вы можете переопределить позицию поиска, передав полный путь просмотра - View ("Views / Shared / Components / Common / YourView.cshtml") при вызове View (viewName, viewModel) из метода Invoke вашего ViewComponent.

    Примечание. Если вы не указываете viewName, по умолчанию используется Default.cshtml, который отличается от Index.html, используемого для контроллеров

Для вашего случая @await Component.InvokeAsync ("ExternalSystems") - это правильный вызов, так как он ожидает имя компонента представления в качестве параметра. ViewName будет извлечено из того, что вы передали в качестве значения параметра viewName для вызова View (viewName, viewModel) в методе Invoke вашего ViewComponent, и по умолчанию будет иметь значение Default.cshtml, если имя представления не указано.

...