在ASP.NET Core 2.1中添加自定义TagHelpers

时间:2018-07-11 12:50:24

标签: c# asp.net asp.net-core asp.net-core-mvc asp.net-core-2.1

我一直遵循ASP.NET Core文档,并花费大量时间来拖曳堆栈溢出来尝试实现简单的自定义TagHelper,但没有成功。

任何人都可以就任何陷阱或已知错误提出建议吗?

应用程序属性:

AssemblyName: AmpWeb
Target Framework .NET Core 2.1

NuGet软件包

Microsoft.AspNetCore.All 2.1.2

环境

OS: Windows 7 (x64)
SDK: Microsoft .NET Core SDK 2.1.302 (x64)
IDE: Visual Studio 2017 Professional 15.7.4

TagHelpers / EmailTagHelper.cs

using Microsoft.AspNetCore.Razor.TagHelpers;

namespace AmpWeb.TagHelpers
{
    [HtmlTargetElement(Attributes = "email")]
    public class EmailTagHelper : TagHelper
    {
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "a";    // Replaces <email> with <a> tag
        }
    }
}

Views / _ViewImports.cshtml

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

Index.cshtml

<h1>Hello World</h1>
<email>WHY</email>

输出

<h1>Hello World</h1>
<email>WHY</email>

1 个答案:

答案 0 :(得分:5)

这是一个微妙的问题,但很重要。问题是这行代码[HtmlTargetElement(Attributes = "email")]

如果将其删除,则可以使用<email>WHY</email>标记来工作。您也可以将其替换为[HtmlTargetElement("email")],但实际上在这种情况下甚至不需要它,因为框架可以从类EmailTagHelper的名称中推断出该信息。

通过包含[HtmlTargetElement(Attributes = "email")]表示您希望通过任何标签上的属性调用标签助手。因此,调用它的过程将类似于<div email></div><span email></span>