二、自定义TagHelper
现在有这样的需求,用于显示Book的编号的label不止要添加名为codeColor的css样式,还要给书的编号自动添加一个前缀,例如“BJ”。
对于这样的需求,希望可以通过一个简单的标记,然后由TagHelper自动实现。例如:
<label show-type="bookCode">1001</label>
自定义了一个属性“show-type”,用于标识这个label的显示类别,“1001”为假定的图书编号。通过这样的设置方式,将来如果需求有变化,需要对编号的显示做更多的修饰,只需修改对应的TagHelper即可,而页面部分不需要做任何调整。
系统提供了方便的自定义TagHelper的方式,就是继承系统提供的TagHelper类,并重写它的Process/ProcessAsync方法,例如下面的例子:
public class LabelTagHelper : TagHelper { public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { if (output.Attributes.TryGetAttribute("show-type", out TagHelperAttribute showTypeAttribute)) { if (showTypeAttribute.Value.ToString().Equals("bookCode")) { output.Attributes.SetAttribute("class", "codeColor"); string content = output.Content.IsModified ? output.Content.GetContent() : (await output.GetChildContentAsync()).GetContent(); ; output.Content.SetContent("BJ" + content); } } } }
首先判断label是否被设置了show-type="bookCode",然后获取当前label的Content内容,将其添加前缀“BJ”后作为此label的Content的新内容。注意一下Content的获取方式,如果它没有被修改,凭感觉直接通过output.Content.GetContent()获取到的内容是空的。
访问index页面,可以看到改标签已被处理,如下图:
备注:a.关于获取show-type的值,还可以有其他方式,下文会讲到。
b.从规范化命名的角度,建议将自定义的TagHelper其命名为XXXagHelper这样的格式。