自定义标签助手不工作

Custom tag helper not working

我遵循了一些关于为 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

Annnndd...没什么。没有智能感知,没有标签替换...

有什么想法吗?

您只需在视图导入文件中提供程序集名称。

_ViewImports.cshtml:

@addTagHelper *, ToolConstrolSystem

Managing Tag Helper scope

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

上面的代码使用通配符语法 (*) 来指定指定程序集 (Microsoft.AspNetCore.Mvc.TagHelpers) 中的所有 Tag Helpers 将对 Views 中的每个视图文件可用目录或子目录。

所以我浪费了一些时间来解决 taghelper 不工作的问题。过了一会儿我上床睡觉了,今天我又重新尝试了一下,然后我才意识到我没有在 Razor Pages 文件夹中仅在 Views 文件夹中添加 @addTagHelper。

因此,如果您喜欢我的 /Pages + /Views 概念,请务必阅读所有这些 _ViewImports.cshtml。 在这里留下这张纸条,希望能提醒一些疲惫的大脑,如果它有助于休息一下,去散步或小睡一下。

一种可以更快地搜索 TagHelper 的方法是提供标签助手所在的命名空间,而不是星号,星号会在程序集中随处可见。

@addTagHelper com.excellor.TagHelpers.*, excellor

其中 excellor 是程序集名称,com.excellor.TagHelpers 是标签助手所在的命名空间。

请注意,只要您为标签助手命名空间,就不需要以下条目。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

如果您发现无法通过以下调用设置您的内容,请检查另一件事:

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

是为了检查您没有将标签助手用作 empty/void 元素,例如:

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

要添加内容,标签助手必须有一个结束标签:

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

还要记住,目前(2020 年 3 月).Net Core 3 会自动生成带有下划线的命名空间。尽管如此,程序集名称将与文件夹名称完全相同(即使它确实包含空格和其他不常见的文件夹名称符号)。它可能会导致添加自定义标签助手时出现问题。

让我们假设:

  1. 您有一个名为 SUPER-TEST 的文件夹
  2. cd进去然后调用dotnet new mvc
  3. 这使您的新项目具有命名空间 "SUPER_TEST"。
  4. 您在此命名空间中创建一个标记助手并将程序集名称包含到 _ViewImports 中,如下所示:
***
@addTagHelper *, SUPER_TEST
***

这是行不通的。因为实际上您的程序集现在称为 SUPER-TEST。 .Net Core 运行时在创建新项目时将下划线替换为破折号。

因此,您必须从 SUPER-TEST 导入标签助手,如下所示:

***
@addTagHelper *, SUPER-TEST
***

我遇到了同样的问题,但这是 @addTagHelper 行末尾的流氓、意外分号的结果。

我有:

@addTagHelper *, ToolConstrolSystem;

而不是:

@addTagHelper *, ToolConstrolSystem

虽然解决方案将构建并且 运行 正常,但如果 @addTagHelper 行包含分号,标签助手将无法工作。

对于正确使用语法但在不同项目中有自己的视图和 TagHelper 的人:

  • 重建 TagHelper 项目
  • 然后重建视图项目

它会起作用。

啊,终于找到我的错误了。 @addTagHelper *, [needs assemply-name] 不是默认命名空间名称!

对我来说:

@addTagHelper *, MyProject_Website

必须是:

@addTagHelper *, MyProject-Website

see your project property!

另一个导致我的标签助手无法工作的小技巧:

例如CustomButtonTagHelper 将作为 custom-button.

提供

所以 pascal 大小写将被 kebab 大小写取代。