Просмотр компонента как вспомогательной функции тега не вызывается

Вызов компонента представления в качестве вспомогательной функции тега был представлен в ASP.NET Core 1.1. (См. «Вызов компонента представления в качестве вспомогательной функции тега»). Но следующее возвращает только часть представления Test for VC. Кажется, что часть <vc:annual-orders>…</vc:annual-orders> вообще не вызывается.

Views \ Shared \ Components \ AnnualOrders \ Default.cshtml:

@{ 
    Layout = "";
}
<div>Test for VC</div>
<div>
    <vc:annual-orders>

    </vc:annual-orders>
</div>

myProj \ ViewComponents \ AnnualOrdersViewComponent.cs:

public class AnnualOrdersViewComponent : ViewComponent
{
    private readonly OrdersContext _context;

    public AnnualOrdersViewComponent(OrdersContext context)
    {
        _context = context;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var lastOrders = _context.Where(t => t.orderType == "new");
        return View(await lastOrders);
    }
}

ЗАМЕТКА:

  1. Я использую ASP.NET Core 1.1, и компоненты представления без вспомогательных функций тегов работают нормально.
  2. Я также следил за официальным руководством MSDN «Вызов компонентов представления в качестве помощников тегов», где объясняется, что имена классов PascalCase и параметры методов для вспомогательных функций тегов переводятся в их нижний kebab-case.

comment
Нам, я занимаюсь уборкой своих старых ответов и заметил, что этот вопрос никогда не отмечался как решенный. Я предполагаю, что мой ответ не был решением вашей конкретной ситуации, но подозреваю, что Ответ @ Alan Savage был. Если да, можете ли вы отметить его как принятый? (Если, конечно, вы вспомнили об этой конкретной проблеме и о том, что ее решило.)   -  person Jeremy Caney    schedule 23.07.2021


Ответы (3)


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

Даже если помощник тега правильно зарегистрирован, например, _ViewStart.cshtml, согласно ответу @ alan-savage, он не будет отображаться, если вы не включите все параметры из метода InvokeAsync().

Это может показаться самоочевидным, но на начальном этапе это может сбивать с толку, поскольку он не отвечает с исключением, и для этого в Visual Studio не встроена (очевидная) проверка во время разработки.

Примечание. На самом деле есть проверка во время разработки, но это неочевидно. В редакторе кода компоненты представления с правильными ссылками будут выделены жирным шрифтом с именами свойств. Но это легко упустить, если вы этого не ищете. И нет, например, предупреждение, которое отображается на панели Список ошибок или как часть вывода сборки.

Так, например, если у вас вместо этого были:

public class AnnualOrdersViewComponent : ViewComponent {
  public async Task<IViewComponentResult> InvokeAsync(string labelName) {
    … 
  }
}

А затем вызвали помощника по тегу как:

<vc:annual-orders></vc:annual-orders>

Ваш код будет компилироваться без предупреждения, и ваша страница будет работать без исключения, но компонент представления не будет отображаться.

Фактически, это могло бы произойти даже, если бы вы сделали параметр компонента представления необязательным, поскольку синтаксис вспомогательного тега не учитывает необязательные параметры:

public class AnnualOrdersViewComponent : ViewComponent {
  public async Task<IViewComponentResult> InvokeAsync(string labelName = null) {
    … 
  }
}

Примечание. Начиная с .NET 6 Preview 6, View Components, называемые Tag Helpers, будут учитывать необязательные параметры (источник).

Очевидно, что в любом из приведенных выше примеров это можно исправить, просто включив все параметры:

<vc:annual-orders label-name="Contrived Example"></vc:annual-orders>

Опять же, это не касается специфики вашей проблемы, но я полагаю, что разработчики, столкнувшиеся с этой проблемой, скорее всего, столкнутся с этой веткой, поэтому я хотел включить это как еще один шаг по устранению неполадок на случай, если помощник тега уже был правильно зарегистрирован.

person Jeremy Caney    schedule 23.10.2019
comment
Обновление. Начиная с версии ASP.NET Core 6 Preview 6, Microsoft реализовала поддержку дополнительных параметров при вызове компонентов представления в качестве вспомогательных функций тегов (source). Я соответствующим образом обновил свой ответ. - person Jeremy Caney; 02.06.2021

Я боролся с этим и, наконец, мне удалось заставить работать помощников тегов для компонентов представления.

Проблема заключалась в том, что помощники тегов не работали с представлениями в областях. Чтобы решить эту проблему, я скопировал страницы _ViewImports.cshtml и _ViewStart.cshtml из каталога /Views в каталог /Areas/<AreaName>/Views. Помощники тегов теперь работают, и Visual Studio предоставляет мне IntelliSense для моих свойств.

Не забудьте добавить в _ViewStart.cshtml файлы (где <AssemblyName> - это имя сборки, содержащей компоненты представления:

@addTagHelper *, <AssemblyName>
person Alan Savage    schedule 30.11.2017
comment
Только что обнаружил, что AssemblyName чувствителен к регистру даже в Windows. - person x5657; 08.02.2020
comment
Кроме того, я забываю (пере) регистрировать помощников тегов почти каждый раз, когда представляю новую область. Это, наряду с тем, что я не забываю включать атрибут [Area()] в мои элементы управления, учитывает больше времени на устранение неполадок, которое я хочу признать, поскольку источник ни одной проблемы сразу очевиден на основе выходных данных. - person Jeremy Caney; 12.08.2020
comment
Для ASP.NET Core 3.1 я обнаружил, что при использовании компонентов представления из Библиотека классов Razor (RCL), веб-сайт-потребитель должен использовать @addTagHelper, как указано в этом ответе, для добавления сборки RCL, даже если компоненты просмотра потребляются внутри представлений RCL. - person Uwe Keim; 28.10.2020

это не работает.

@addTagHelper *, MyProject.Components

это работает

@addTagHelper *, MyAssemblyName

он принимает имя сборки, а не пространство имен.

person Rm558    schedule 13.08.2020