您可以通过实现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); } }