Вспомогательная функция настраиваемого тега не работает

Я выполнил несколько руководств по созданию помощника настраиваемого тега для ASP Core.

Это мой помощник:

using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;

namespace ToolControlSystem.TagHelpers
{
    [HtmlTargetElement("description", Attributes = DescriptionAttributeName, TagStructure = TagStructure.NormalOrSelfClosing)]
    public class DescriptionTagHelper : TagHelper
    {
        private const string DescriptionAttributeName = "asp-for";


        [HtmlAttributeName(DescriptionAttributeName)]
        public ModelExpression Model { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            base.Process(context, output);

            var description = GetDescription(Model.ModelExplorer);

            output.TagName = "span";
            output.TagMode = TagMode.StartTagAndEndTag;
            output.Content.SetContent(description);
        }

        private string GetDescription(ModelExplorer modelExplorer)
        {
            string description;
            description = modelExplorer.Metadata.Placeholder;

            if (String.IsNullOrWhiteSpace(description))
            {
                description = modelExplorer.Metadata.Description;
            }

            return description;
        }
    }
}

Я бросаю это в _ViewImports.cshtml: @addTagHelper *, ToolConstrolSystem.TagHelpers

Аннннд ... ничего. Ни intellisense, ни замены тегов ...

Любые идеи?


person Matthew Goulart    schedule 15.01.2018    source источник


Ответы (9)


В файле импорта представления необходимо указать только имя сборки.

_ViewImports.cshtml:

@addTagHelper *, ToolConstrolSystem
person Anuraj    schedule 16.01.2018
comment
Это действительно раздражало. Спасибо за ответ. - person Edgar Froes; 06.04.2018
comment
Вау, это должно быть хотя бы (!) Выделено жирным шрифтом в документации. Потратил несколько часов на то, чтобы гадать, что же пошло не так. - person Mikhail; 21.04.2018
comment
Документация делает вид, будто это пространство имен, а не имя сборки. * faceplam * - person qJake; 12.06.2018
comment
Название сборки !! У меня было пространство имен. Потрачено 3 часа, пока я не прочитал это. - person Alpha75; 28.11.2018
comment
TimeSpentOnThinkingItWasANamespace + = TimeSpan.FromMinutes (15); - person agrath; 06.01.2019
comment
К счастью, с тех пор они сделали документацию более понятной: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/ - person Miguel J.; 15.01.2019
comment
Aaaaaaaaaaaaaaaaaaaaaarghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh. Спасибо - person Juan R; 09.04.2019
comment
Спасибо, это действительно помогло. - person Charles Owen; 18.11.2019
comment
кроме того, имя сборки не может содержать _ в имени - person UserName; 03.01.2021
comment
OMG, я не могу поверить, что для этого требуется имя ASSEMBLY, а не пространство имен. 2-3 часа потрачено зря. Большое спасибо. - person Speednet; 29.03.2021
comment
Кроме того, мне просто нужно было точно сопоставить верхний / нижний регистр, чтобы он работал. И ни одного сообщения об ошибке не отображалось: / - person Johan Danforth; 07.04.2021
comment
Ты спас мне день: ДД - person Tomas Blanárik; 01.06.2021

См. раздел Управление вспомогательной функцией тега

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, AuthoringTagHelpers

В приведенном выше коде используется синтаксис с подстановочными знаками («*»), чтобы указать, что все вспомогательные функции тегов в указанной сборке (Microsoft.AspNetCore.Mvc.TagHelpers) будут доступны для каждого файла представления в каталоге или подкаталоге Views.

person RickAndMSFT    schedule 13.06.2018
comment
То, что было не так и с моим, в этом примере было не так, большое спасибо - person csharpdudeni77; 01.07.2020

Также имейте в виду, что на данный момент (март 2020 г.) .Net Core 3 автоматически генерирует пространства имен с подчеркиванием в нем. Тем не менее, имя сборки будет точно таким же, как имя папки (даже если оно содержит пробелы и другие необычные символы имени папки). Это может вызвать проблемы с добавлением ваших помощников пользовательских тегов.

Предположим:

  1. У вас есть папка под названием СУПЕР-ТЕСТ
  2. Вы cd в нее и звоните dotnet new mvc
  3. Это делает ваш новый проект пространством имен SUPER_TEST.
  4. Вы создаете помощник тега в этом пространстве имен и включаете имя сборки в _ViewImports следующим образом:
***
@addTagHelper *, SUPER_TEST
***

Это не сработает. Потому что по сути ваша сборка теперь называется СУПЕР-ТЕСТ. Среда выполнения .Net Core заменяет подчеркивание дефисом при создании нового проекта.

Итак, вам нужно импортировать помощники тегов из СУПЕР-ТЕСТА, например:

***
@addTagHelper *, SUPER-TEST
***
person Nikita Pavlovski    schedule 02.03.2020
comment
Святые макароны. Спасибо. По иронии судьбы, я создал проект под названием "electronic_test_project" просто для того, чтобы попрактиковаться в помощниках по тегам. Замена '_' на '-' заставила его работать и запустить Intellisense. @addTagHelper *, electronic-test-project - person jakob_a; 19.11.2020
comment
Большое спасибо за этот ответ! - person Gary Ewan Park; 09.07.2021

Ах, наконец я нашел свою ошибку. @addTagHelper *, [needs assemply-name] не имя пространства имен по умолчанию!

для меня:

@addTagHelper *, MyProject_Website

Должно быть:

@addTagHelper *, MyProject-Website

просмотрите свойство своего проекта!

person Mohammadreza Askari    schedule 02.05.2021

Так что я потратил немного времени на поиски проблемы, когда taghelper не работал. Через некоторое время я лег спать и сегодня свежим взглядом попробовал еще раз, и тогда я понял, что добавил @addTagHelper в папку Razor Pages не только в папку Views.

Так что, если вам нравится, у меня есть концепция / Pages + / Views, обязательно ознакомьтесь со всеми этими _ViewImports.cshtml. Мы надеемся, что оставив эту записку здесь, вы напомните чей-то усталый мозг, и если это помогло, сделайте перерыв и отправьтесь на прогулку или вздремните.

введите описание изображения здесь

person Rui Lima    schedule 24.12.2018

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

@addTagHelper com.excellor.TagHelpers.*, excellor

Где excellor - это имя сборки, а com.excellor.TagHelpers - это пространство имен, в котором находятся помощники тегов.

Обратите внимание, что следующая запись НЕ нужна, пока вы задаете пространство имен для помощников тегов.

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
person Charles Owen    schedule 18.11.2019

У меня была такая же проблема, но она была результатом неправильной, случайной точки с запятой в конце строки @addTagHelper.

Я имел:

@addTagHelper *, ToolConstrolSystem;

Вместо того:

@addTagHelper *, ToolConstrolSystem

Хотя решение будет правильно построено и запущено, помощник тега не будет работать, если строка @addTagHelper содержит точку с запятой.

person Klicker    schedule 22.04.2020

Еще одна вещь, которую нужно проверить, если вы не можете настроить свой контент с помощью таких вызовов, как:

output.Content.AppendHtml("<tags...>");
output.Content.SetHtmlContent("<tags...>");

Это проверить, что вы не использовали свой помощник тега как пустой / void элемент, например:

<my-tag-helper attr="value" />

Для добавления содержимого помощник тега должен иметь закрывающий тег:

<my-tag-helper attr="value"></my-tag-helper>
person Matt    schedule 26.02.2020

Для тех, кто правильно использует синтаксис, но имеет свои представления и TagHelpers в отдельных проектах:

  • Перестройте проект TagHelper
  • Затем перестройте проект View

Это будет работать.

person Bamdad    schedule 13.12.2020