繁体   English   中英

自定义标签助手不起作用

[英]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

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

有任何想法吗?

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

_ViewImports.cshtml:

@addTagHelper *, ToolConstrolSystem

请参阅管理标签助手范围

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

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

还要记住,目前(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 *, [needs assemply-name]不是默认的命名空间名称!

对我来说:

@addTagHelper *, MyProject_Website

必须是:

@addTagHelper *, MyProject-Website

查看您的项目属性!

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

我有:

@addTagHelper *, ToolConstrolSystem;

而不是:

@addTagHelper *, ToolConstrolSystem

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

所以我浪费了一些时间来解决 taghelper 不工作的问题。 过了一会儿我上床睡觉,今天我又重新尝试了一下,然后我意识到我没有在视图文件夹中的 Razor Pages 文件夹中添加 @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...>");

是检查您是否没有将标签助手用作空/空元素,例如:

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

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

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

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

例如CustomButtonTagHelper将作为custom-button可用。

因此 pascal case 将被 kebab case 取代。

对于那些正确使用语法但在不同的项目中拥有他们的视图和他们的 TagHelper 的人:

  • 重建 TagHelper 项目
  • 然后重建View项目

它会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM