自定义标签助手不工作
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
@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 会自动生成带有下划线的命名空间。尽管如此,程序集名称将与文件夹名称完全相同(即使它确实包含空格和其他不常见的文件夹名称符号)。它可能会导致添加自定义标签助手时出现问题。
让我们假设:
- 您有一个名为 SUPER-TEST 的文件夹
- 你
cd
进去然后调用dotnet new mvc
- 这使您的新项目具有命名空间 "SUPER_TEST"。
- 您在此命名空间中创建一个标记助手并将程序集名称包含到 _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 大小写取代。
我遵循了一些关于为 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
@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 会自动生成带有下划线的命名空间。尽管如此,程序集名称将与文件夹名称完全相同(即使它确实包含空格和其他不常见的文件夹名称符号)。它可能会导致添加自定义标签助手时出现问题。
让我们假设:
- 您有一个名为 SUPER-TEST 的文件夹
- 你
cd
进去然后调用dotnet new mvc
- 这使您的新项目具有命名空间 "SUPER_TEST"。
- 您在此命名空间中创建一个标记助手并将程序集名称包含到 _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 大小写取代。