微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASP.NET Core – TagHelper

前言

以前写的 Asp.net core 学习笔记之 Tag Helper, 这篇是整理版.

 

介绍

TagHelper 有点像 Angular 的指令 directive, 绝大部分情况下都是用来装修 element 的. 比如 add class.

下面是 ASP.NET Core build-in 的 tag, 应该可以感觉出来它都用在什么地方了. 我用它来实现 router link active 的功能.

 

Create Tag Helper

[HtmlTargetElement(Attributes = "[routerLinkActive]")]
public class RouterLinkActiveTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        base.Process(context, output);
    }
}

创建一个 RouterLinkActiveTagHelper class 继承 TagHelper

HtmlTargetElement 负责定义 selector, 和 Angular 一样它需要一个 selector 做匹配

Process 负责对 element 做任何修改, 比如 add class, innerHtml, appendHtml 等等.

还有一种 selector 是 for tag 的. 比较少用到, 也是和 Angular 一样的概念, directive 通常是匹配 attribute 但其实是可以匹配 element tag 的 (有些 Angular 玩家都不知道呢).

[HtmlTargetElement("my-email", TagStructure = TagStructure.@R_404_6462@malOrSelfClosing)]

要使用前需要添加 view import

 

然后就可以用了

<body>
  <a routerLinkActive href="/contact">Contact</a>
</body>

 

data-* 和 asp-* 是不合格的 selector

asp- 是 ASP.NET Core 保留和专用的 selector, 所以我们用不到.

data- 不能用是因为

所以切记, 不要用 asp- 和 data- 作为 selector

 

@input()

@input 原至 Angular, 就是在使用指令的时候, 传入一些变量作为操控.

<a routerLinkActive company-name="Abc" company-age="15" href="/contact">Contact</a>

传入 company name 和 age

通过 property 接收

[HtmlAttributeName("company-name")]
public string CompanyName { get; set; } = "";

public int? CompanyAge { get; set; }

认是 kebab-case map to PascalCase, 如果想取别名就使用 HtmlAttributeName 声明就可以了.

自动做类型转换. empty string != null 哦, null 指的是完全没有放 attribute.

 

Process

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    if (output.Attributes.TryGetAttribute("class", out var attribute))
    {
        var value = attribute.Value; // readonly
    }
    output.AddClass("active", HtmlEncoder.Default);
    output.Attributes.Add("data-attribute", "value");
    output.Content.SetHtmlContent("<h1>Email1</h1>");
    output.Content.AppendHtml("<h1>Email2</h1>");
    base.Process(context, output);
}

常见的操作有, add class, append html, inner html, get attribute 等等.

 

Read ViewContext

ViewContext 包含了常用到的 ViewBag, ViewData, RouteData, HttpContext 等等.

[ViewContext]
[HtmlAttributeNotBound]
public ViewContext ViewContext { get; set; } = null!;

通过 ViewContent Attribute 声明就可以了.

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐