Использование TagHelpers и ViewComponents в ASP.NET MVC6

Я пытаюсь понять различия в вариантах использования между TagHelpers и ViewComponents в asp.net 5, потому что функциональность конечного результата кажется очень похожей. У нас есть TagHelpers, которые могут создавать новые HTML-теги, которые анализируются движком Razor, а затем ViewComponents, которые вызываются явно. Оба возвращают некоторый HTML-контент, оба поддерживаются соответствующими базовыми классами, оба имеют асинхронные версии методов, которые они могут реализовать для выполнения своей работы.

Итак, когда один будет использоваться вместо другого? Или я упускаю какую-то информацию?


person cecilphillip    schedule 08.12.2014    source источник


Ответы (5)


Определенно есть некоторое концептуальное совпадение между TagHelpers и ViewComponents. TagHelpers — это ваша утилита для работы с HTML, тогда как ViewComponents — это ваш способ придерживаться C#, выполнять изолированную работу, а затем выплевывать HTML. Я подробно расскажу о каждом:

ViewComponents
Ваш концептуально эквивалентный мини-контроллер; вы увидите, что многие методы/свойства, предоставляемые ViewComponents, очень знакомы тем, которые существуют в контроллере. Теперь, что касается вызова ViewComponents, это больше эквивалентно использованию помощников HTML (одна вещь, которую TagHelpers делают лучше). Подводя итог ViewComponents: их основная цель — чувствовать себя контроллером, оставаться на земле C# (возможно, нет необходимости добавлять утилиту в HTML), выполнять меньшую/изолированную работу, а затем выплевывать строковый HTML.

TagHelpers
Утилита, которая позволяет вам работать с существующим HTML или создавать новые элементы HTML, которые изменяют то, что происходит на странице. В отличие от ViewComponents, TagHelpers может ориентироваться на любой существующий HTML и изменять его поведение; пример: вы можете добавить атрибут conditional ко всем HTML-элементам, которые будут условно отображать элемент на стороне сервера. TagHelpers также позволяют вам смешивать общие термины HTML, например:

<myTagHelper class="btn">Some Content</myTagHElper>

Как видите, мы добавляем атрибут класса в наш TagHelper так же, как если бы это был HTML. Чтобы сделать это в ViewComponents, вам нужно передать словарь атрибутов или что-то эквивалентное (неестественное). Наконец, несколько TagHelpers могут работать с одним элементом HTML; каждый имеет свою собственную стадию изменения вывода (позволяет использовать модульные наборы инструментов TagHelper). Подводя итог, TagHelpers: они могут делать все, что могут делать ViewComponents, и даже больше, НО не чувствуют себя знакомыми с такими вещами, как контроллеры, к которым привыкли разработчики ASP.NET; также некоторые проекты могут не захотеть смешивать HTML на стороне сервера.

Дополнительно:
Недавно я снял видео, демонстрирующее преимущества TagHelpers. В основном прогулка по тому, в чем они хороши и как их использовать. Вы можете посмотреть его здесь< /а>.

person N. Taylor Mullen    schedule 10.12.2014

Решая, какой из них использовать, я всегда учитываю, насколько сложным будет HTML-код компонента.

Если это что-то простое, например, древовидное представление или пейджер

<ul class="jstree">
    <li>Node 1</li>
    <li>...</li>
</ul>

Это кандидат на роль помощника тегов, потому что он прост. Большой HTML-код в коде C# будет сложно поддерживать.


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

person Xeevis    schedule 23.01.2018

Оказывается, в .Net Core 1.1 вы можете вызывать ViewComponent, используя синтаксис tagHelper.

Что касается комментария Тейлора «Их основная цель - чувствовать себя контроллером», это правда, но, поскольку вы не можете напрямую называть этот «микроконтроллер» напрямую, «контроллероподобное» поведение ограничено тем, что вы можете создать только часть страницы, вы не можете вызвать ее снова (скажем, через вызов ajax, действие редактирования и т. д.).

person Kyriakos    schedule 04.12.2016

Одно основное различие между TagHelpers и ViewComponents связано с объемом работы, которую должен выполнить объект. TagHelper довольно просты и требуют только одного класса, который переопределяет метод Process для создания вывода TagHelper. Недостатком является то, что если вы выполняете какую-либо сложную работу по созданию внутреннего HTML в TagHelper, все это должно выполняться в коде. В ViewComponent у вас есть мини-контроллер, способный выполнять гораздо больше работы, плюс он возвращает представление, в котором у вас есть реальный синтаксический код Razor, который можно сопоставить с моделью.

В другом сообщении упоминалось, что ViewComponents более «HTML Helper» в том, как вы их называете. В ASP.NET 1.1 эта проблема решена, поэтому вы можете вызывать ее с помощью

<vc:view-component-name param1="value1" param2="value2></vc:view-component-name>

В большинстве случаев TagHelper имеет определенное преимущество, потому что он проще. Но если вам нужно более надежное решение, вам подойдет ViewComponent.

person saluce    schedule 03.04.2017

И все же что-то вроде поражения цели View Components (IMHO) заключается в том, что из класса View Component, кажется, нет способа получить доступ к внутреннему Html VC, если вы используете синтаксис вспомогательного тега:

 <vc:MyComponent id="1" att="something">
     Some HTML markup you would not want to put in an attribute
 </vc:MyComponent>

Однако есть хорошие приложения VC, такие как компонент панели навигации Bootstrap, который я видел в записи блога TechieJourney.

person Lord of Scripts    schedule 12.05.2017
comment
Вы можете обернуть свой ViewComponent в пользовательский TagHelper как описан здесь. Таким образом, вы сможете получить доступ к HTML-разметке внутри TagHelper и передать ее в ViewComponent при необходимости. - person IlliakaillI; 05.07.2017