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