asp.net-core 自定义标签助手

示例

您可以通过实现ITagHelper便捷类或从便捷类派生来创建自己的标记帮助器TagHelper。

  • 默认约定是将与帮助程序名称匹配的html标签作为目标,而不带可选的TagHelper后缀。例如WidgetTagHelper将目标<widget>代码定位。

  • 该[HtmlTargetElement]属性可用于进一步控制要定位的标签

  • 可以在剃刀标记中为该类的任何公共属性提供值作为属性。例如,public string Title {get; set;}可以给公共财产一个值,例如<widget title="my title">

  • 默认情况下,标记助手将Pascal大小写的C#类名称和标记助手的属性转换成小写的kebab大小写。例如,如果您省略了使用[HtmlTargetElement],而类名是WidgetBoxTagHelper,则在Razor中您将编写<widget-box></widget-box>。

  • Process并ProcessAsync包含渲染逻辑。两者都接收一个上下文参数,其中包含有关正在渲染的当前标签的信息,以及一个用于自定义渲染结果的输出参数。

包含自定义标签帮助程序的所有程序集都需要添加到_ViewImports.cshtml文件中(请注意,这是正在注册的程序集,而不是名称空间):

@addTagHelper *, MyAssembly

样本小部件自定义标签助手

下面的示例创建一个自定义的小部件标签帮助程序,该工具将针对剃刀标记,例如:

<widget-box title="My Title">This is my content: @ViewData["Message"]</widget-box>

它将呈现为:

<div class="widget-box">
    <div class="widget-header">My Title</div>
    <div class="widget-body">This is my content: some message</div>
</div>

创建此类标签帮助程序所需的代码如下:

[HtmlTargetElement("widget-box")]
public class WidgetTagHelper : TagHelper
{
    public string Title { get; set; }

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        var outerTag = new TagBuilder("div");
        outerTag.Attributes.Add("class", output.TagName);
        output.MergeAttributes(outerTag);
       output.TagName= outerTag.TagName;

        //创建标题
        var header = new TagBuilder("div");
        header.Attributes.Add("class", "widget-header");
        header.InnerHtml.Append(this.Title);
        output.PreContent.SetHtmlContent(header);

        //创建正文并替换原始标签帮助程序内容
        var body = new TagBuilder("div");
        body.Attributes.Add("class", "widget-body");
        var originalContents = await output.GetChildContentAsync();
        body.InnerHtml.Append(originalContents.GetContent());
        output.Content.SetHtmlContent(body);
    }
}