自定义标记助手无法正常工作

时间:2018-01-15 22:23:30

标签: c# asp.net-core model asp.net-core-tag-helpers

我遵循了一些关于为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 ......没什么。没有intellisense,没有替换标签...

有什么想法吗?

9 个答案:

答案 0 :(得分:57)

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

_ViewImports.cshtml: 

@addTagHelper *, ToolConstrolSystem

答案 1 :(得分:4)

See Managing Tag Helper scope

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

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

答案 2 :(得分:3)

还要记住,目前(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
***

答案 3 :(得分:2)

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

对我来说:

@addTagHelper *, MyProject_Website

必须是:

@addTagHelper *, MyProject-Website

see your project property!

答案 4 :(得分:0)

因此,我浪费了一些时间在解决taghelper无法正常工作的问题上。过了一会儿,我去睡觉了,今天我又换了个新的尝试,然后才意识到,我并没有只在Views文件夹的Razor Pages文件夹中添加@addTagHelper。

因此,如果您喜欢我的/ Pages + / Views概念,请确保遍历所有_ViewImports.cshtml。 希望在这里留下这张纸条会提醒某人疲惫的大脑,以及是否有助于休息一下,散步或小睡。

enter image description here

答案 5 :(得分:0)

可以更快地搜索TagHelpers的一种方法是提供标签助手所在的命名空间,而不是星号,后者会出现在程序集中的任何地方。

@addTagHelper com.excellor.TagHelpers.*, excellor

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

请注意,只要您为标签助手命名,就无需输入以下内容。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

答案 6 :(得分:0)

要检查是否发现无法通过以下呼叫设置内容:

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

用于检查您是否没有将标记帮助程序用作空/空元素,例如:

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

要添加内容,标记助手必须具有结束标记:

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

答案 7 :(得分:0)

我遇到了同样的问题,但这是由于@addTagHelper行末出现了一个冒号,偶然的分号造成的。

我有:

@addTagHelper *, ToolConstrolSystem;

代替:

@addTagHelper *, ToolConstrolSystem

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

答案 8 :(得分:0)

对于那些正确使用语法但将其视图和TagHelper放在单独项目中的人:

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

它将起作用。