refer :

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring?view=aspnetcore-5.0

https://visualstudiomagazine.com/articles/2019/05/01/creating-custom-tag-helpers.aspx

tag helper 有点像 angular 的指令.

也适合拿来做一些 ui 组件, 或者是装修一下原生组件.

从 asp.net core build-in 的 tag helper 可以看出它合适的使用场景.

我们来看看它是怎样 work 起来的.

首先做一个 class 继续 TagHelper

[HtmlTargetElement("my-email", TagStructure = TagStructure.NormalOrSelfClosing)]
[HtmlTargetElement(Attributes = "[name]=test")]
public class EmailTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{ }
}

HtmlTargetElement attribute 是给我们写 selector 的. my-email 是 tag name, TagStucture 是说 tag 的关闭方式, 比如 <div></div> or <dada/> or <input>

多个 HtmlTargetElement 就是可以匹配多种情况, or 的 condition.

Process 方法就是给我们做装修的, 可以添加 attributes, content html, 换 tag 等等

调用

<my-email dada="1234"></my-email>

dada="1234 " 是 angular 的 @Input

在 class 里面加一个 property 就可以了. 默认情况虾 TotalCount 对应的 attribute name 是 total-count (Pascal case to kebab case)

public class EmailTagHelper : TagHelper
{
[HtmlAttributeName("dada")]
public int TotalCount { get; set; }
}

来看看 process

public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.Attributes.SetAttribute("class", "abc xyz");
output.Content.SetHtmlContent($"<p>Custom Tag {TotalCount}</p>");
}

常用的操作修改 tag, set attribute, set content html

现在来说说 passing value 沟通, 比如 parent child 沟通, 和当前 global view 沟通等等.

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

view context 就可以拿到 RouteData, ViewBag, ViewData 等资料

parent child 沟通起来还是比较麻烦的.

refer :

https://blog.techdominator.com/article/the-very-basics-of-nesting-for-tag-helpers.html

[HtmlTargetElement("email", TagStructure = TagStructure.NormalOrSelfClosing)]
public class EmailTagHelper : TagHelper
{
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
context.Items.Add(typeof(EmailContext), new EmailContext());
var childContent = await output.GetChildContentAsync();
var emailChildren = ((EmailContext)context.Items[typeof(EmailContext)]).EmailChildren;
var contentString = childContent.GetContent(); // get content string
}
} [HtmlTargetElement("email-child", TagStructure = TagStructure.NormalOrSelfClosing)]
public class EmailChildTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var emailContext = (EmailContext)context.Items[typeof(EmailContext)];
emailContext.EmailChildren.Add(this);
}
}

parent 通过 Context.Items 传入一个容器 (也可以传入子层需要的资料), child 把资料放入容器中.

parent await GetChildContentAsync, 等待子层完成后, 再打开容器, 把子层放进去的资料拿出来.

这样就可以 parent child 沟通了, 看上去容器时多余的, 子层为什么不能也使用 context.Items.Add 的方式回传给 parent 呢?

因为它是一个 copy... 我也不知道为什么它这样设计啦.

好, 就介绍这么多, 我自己目前够用了.

Asp.net core 学习笔记之 Tag Helper的更多相关文章

  1. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  2. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

  3. Asp.net Core学习笔记

    之前记在github上的,现在搬运过来 变化还是很大的,感觉和Nodejs有点类似,比如中间件的使用 ,努力学习ing... 优点 不依赖IIS 开源和跨平台 中间件支持 性能优化 无所不在的依赖注入 ...

  4. Asp.Net Core学习笔记:(二)视图、模型、持久化、文件、错误处理、日志

    TagHelper 入门 优点:根据参数自动生成,不需要手写超链接,类似Django模板里面的url命令. 在ViewImport中添加TagHelper @addTagHelper *,Micros ...

  5. ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用

    前言 首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果.还记得上篇文章中最后提及到,假如服务越来越多怎 ...

  6. ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置

    前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...

  7. ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项

    前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...

  8. asp.net.core学习笔记1:swagger的使用和webapi接收Jobject对象

    环境:asp.net.core 3.1 (一觉醒来官方已经不推荐3.0了,于是没有任何core经验,也只能开始了3.1的开发学习) 由于现有项目前后端分离.微服务化日趋流行,所以上手不采用web应用( ...

  9. Asp.net core 学习笔记 ( Data protection )

    参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...

  10. Asp.net core 学习笔记 SignalR

    refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...

随机推荐

  1. webpack4.15.1 学习笔记(八) — 缓存(Caching)

    目录 输出文件名(Output Filenames) 缓存第三方库 将 js 文件放到一个文件夹中 webpack 打包模块化后的应用程序,会生成一个可部署的 /dist目录,只要 /dist 目录中 ...

  2. Django查询特定条件的数据并插入其他表格模型

    要将特定 wk_nu 值对应的数据批量插入到 MPS005D3Model 中,你可以执行以下步骤: 确定要插入的 wk_nu 值. 获取与该 wk_nu 相关的数据. 将获取的数据逐一创建为 MPS0 ...

  3. [oeasy]python0095_乔布斯求职_雅达利_atari_breakout_打砖块_布什内尔_游戏机_Jobs

    编码进化 回忆上次内容 上次 我们回顾了 电子游戏的历史 从 电子游戏鼻祖 双人网球 到 视频游戏 PingPong 再到 街机游戏 Pong 雅达利 公司 来了 嬉皮士 捣乱? 布什内尔 会如何 应 ...

  4. oeasy教您玩转vim - 70 - # 折叠细节

    ​ 折叠细节 回忆上次 上次我们讲的是折叠 折叠有很多options foldlevel - 显示折叠层次 foldcolumn - 折叠树宽度 foldmethod - 折叠方式 manual - ...

  5. 字符—字符与整数的关系&&常用的库函数_C

    // Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...

  6. Python 标准类库-因特网数据处理之Base64数据编码

    该模块提供将二进制数据编码为可打印ASCII字符并将这种编码解码回二进制数据的功能.它为RFC 3548中指定的编码提供编码和解码功能.定义了Base16.Base32和Base64算法,以及事实上的 ...

  7. docker 安装 centos8 mysql8 java tomcat

    docker 安装 centos8  mysql8  java tomcat 一,首先在window10系统安装docker,这里就不再描述了. 二,启动docker下载安装centos8镜像 注意: ...

  8. 【Vue】树状节点接口 与 级联选择框组件

    原来有一个组织机构的渲染, 我自己写的我自己看也8太明白了: https://www.cnblogs.com/mindzone/p/14888046.html 现在,有一个位置选择,使用这个级联选择器 ...

  9. AI开源是否应该完全开源?AI的完全开源是否可以实现?

    看了一个视频: 袁进辉:零代码改动,加速AIGC 里面提到了一个完全开源的概念,感觉有些意思,虽然觉得可实现性不高,嘿嘿嘿!!! AI的完全开源: 训练数据开源.数据清洗过程开源.模型权重开源.项目代 ...

  10. idea中多线程debug实现方案

    1.背景 2.步骤 步骤一: 步骤二: 步骤三: 启动测试,查看个线程状态 完美