之前我们有一篇:“动态生成多级菜单”,对使用Html Helper做了详细讲述,并且自定义了一个菜单的 Html Helper: https://www.cnblogs.com/miro/p/5541086.html

Html Helper是关联前后端的一个核心组件,后面的ASP.NET Core 又推出了Tag Helper,  作用和Html Helper很类似。

一般来说,如果作用类似,后推出的都会做一些改进,我们先来看下两者的比较。

一、Html helper 和 Tag Helper 对比

先来一个比较例子:

下面用 Html Helper 创建一个 lable

@Html.Label("FirstName", "First Name:", new {@class="caption"})

再来看实现同样标签的 tag helper

<label class="caption" asp-for="FirstName"></label>

可以看到 Html Helper的语法是作为一个方法 @Html.XXX(各种参数 , 其他参数 …)

来调用的。

上面 Html Helper例子中的方法有三个参数,前面两个是字符串,最后一个是匿名对象( 用作html的属性,new {@class="caption"} )

而 Tag Helper 和原生的html标签很像,只不过增加了一些特有的属性(asp-开头的attribute)。

如果你用vs进行编辑时会发现,Html Helper 没有智能提示(像字符串,匿名对象这些没办法智能提示),Tag Helper则可以智能提示。

另外,很明显我们可以看出,Tag Helper的写法更加干净,可读性和维护性都比 Html Helper好。

如果熟悉前端,即使不熟悉c#,也能很容易看懂进行前后端协作开发。

我们简单小结一下,主要有这两点:

1、Tag Helper 有智能提示

2、Tag Helper可读性好,易于分工合作

说明:

Tag Helper不能完全取代Html Helper, 不是每个Html Helper都有对应的Tag Helper

下面我们直接动手来开发一个自己的Tag Helper(方便起见,我们接着之前的VCDemo这个项目改)。

二、自定义一个 Tag Helper

场景:

我们模拟稍微复杂一点的场景,不仅仅是简单的改变一下标签属性,我们定义一个可以接收数据的Tag Helper。

我们定义一个类用来放置网站信息,包括版本号,版权声明,以及声明日期。

然后定义一个Tag Helper,接收这个类的数据。

前置准备

我们先配置下Tag Helper的作用域,让我们自定义的Tag Helper可以在 view中被识别到。

默认的配置文件在 Views文件夹下的 _ViewImports.cshtml 中。

打开它,可以看到已经有

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

我们通过 @addTagHelper 使得tag helper在view中被识别。

第一个参数是要使用的位置,第二个参数是程序集。

使用通配符*, 代表指定程序集(Microsoft.AspNetCore.Mvc.TagHelpers)下的所有的tag helpers在当前Views文件夹及子文件夹下均可用。

我们仿照它的样子添加一行:

@addTagHelper *, VCDemo

让我们自己的程序集VCDemo下的tag helpers也都可用。

步骤

1、先定义一个类 Models/WebsiteInfo.cs ,用来放置网站信息。

    public class WebsiteInfo

    {

        public Version Version { get; set; }

        public int CopyrightYear { get; set; }

        public string PoweredBy { get; set; }

    }

2、新建文件夹 TagHelpers 用来放置自定义的 tag helper

3、在文件夹中新建类 WebsiteInfoTagHelper,继承于TagHelper,实现Process方法。

    public class WebsiteInfoTagHelper : TagHelper

    {

        public WebsiteInfo Info { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)

        {

            output.TagName = "section";

            output.Content.SetHtmlContent(

               $@"<ul><li><strong>Version:</strong> {Info.Version}</li>

            <li><strong>Copyright Year:</strong> {Info.CopyrightYear}</li>

            <li><strong>Powered by:</strong> {Info.PoweredBy}</li></ul>");

            output.TagMode = TagMode.StartTagAndEndTag;

        }

    }

美元符号$ 指定了后面可以使用占位符{}插入数据, 如果不使用 $ 后面的{}就是普通的字符串。

使用时传入了 WebsiteInfo对象, {Info.Version} 就会替代成相应的值。

4、我们在home/index上添加如下内容:

<h3>以下为版权声明</h3>

@{ WebsiteInfo websiteInfo = new WebsiteInfo

    {

        Version = new Version(, ),

        CopyrightYear = ,

        PoweredBy = "编程小纸条"

    };

}

<website-info info="@websiteInfo" />

 

说明:

最后一行代码:

<website-info info="@websiteInfo" />

1、这个info属性 不是单纯的字符串,是一个类,非字符串的属性可以把“@”省略,即写成这样 <website-info info="websiteInfo" /> 也是可以的。

2、有一个约定,我们之前定义的 tag helper是WebsiteInfoTagHelper:

2.1 我们在前端使用时,首先去掉TagHelper后缀,变成 WebsiteInfo

2.2 然后将WebsiteInfo这种Pascal case的风格,转换成 Kebab case的风格,website-info, 变成:<website-info info="@websiteInfo" />

请参考 stackoverflow各种风格说明:

Pascal Case: SomeSymbol

Camel Case: someSymbol

Snake case:  some_symbol

Kebab case:  some-symbol

https://stackoverflow.com/questions/11273282/whats-the-name-for-hyphen-separated-case/12273101#12273101

运行结果:

三、另外一个小提示

VS编辑器对view中字体做了一些区别

1、单纯的html标签(tag)是灰色字体,属性(attributes)是红色字体,属性值(attribute values)是蓝色字体。如下

2、tag helper相关的属性是加粗紫色, 例如

3、C#代码带有灰色背景色,如下方框处

祝 学习进步 :)

P.S. 系列文章列表:https://www.cnblogs.com/miro/p/3777960.html

MVC+EF Core 完整教程20--tag helper详解的更多相关文章

  1. 开源题材征集 + MVC&EF Core 完整教程小结

    到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点. 下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目. 现向 ...

  2. 国产化之路-统信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 达梦DM8实现简单增删改查操作

    专题目录 国产化之路-统信UOS操作系统安装 国产化之路-国产操作系统安装.net core 3.1 sdk 国产化之路-安装WEB服务器 国产化之路-安装达梦DM8数据库 国产化之路-统信UOS + ...

  3. 一个官翻教程集合:ASP.NET Core 和 EF Core 系列教程

    通过一个大学课程案例讲解了复杂实体的创建过程及讲解 1.ASP.NET Core 和 Entity Framework Core 系列教程——入门 (1 / 10) 2.ASP.NET Core 和 ...

  4. .NET Core使用NPOI导出复杂Word详解

    前言: 最近使用NPOI做了个导出Word文档的功能,关于使用.NET Core 导出Word文档的方式有很多.最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第 ...

  5. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  6. [js高手之路] es6系列教程 - 对象功能扩展详解

    第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...

  7. Nmap扫描教程之基础扫描详解

    Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在 ...

  8. 深入浅出 Cocoa 之 Core Data(1)- 框架详解

    深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...

  9. 七牛云存储Python SDK使用教程 - 上传策略详解

    文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k  ...

随机推荐

  1. curl推送示例:熊掌号,百度站长的链接推送(系统环境变量配置)

    curl推送示例:熊掌号,百度站长的链接推送(需要用户系统环境变量配置)这篇文章主要讲解curl推送,熊掌号,百度站长的链接推送,我们很多seo朋友都搞不定curl的推送链接,而且还要配置系统的环境变 ...

  2. Tensorflow教程(1)Tensorflow的下载和安装

    人工智能已经成为了目前的大趋势,作为程序员的我们也应该跟着时代进步.Tensorflow作为人工智能领域的重要工具,被广泛的使用在机器学习的应用当中. Tensorflow使用人数众多.社区完善,所以 ...

  3. 【Aizu - 0033】Ball (简单搜索)

    -->Ball 原文是日语,这里直接写中文了 Descriptions: 如图所示,容器中间有一枢轴,下方分为两路.容器上方开口,从1到10连续编号的小球从容器开口A放入.通过调整枢轴E的方向, ...

  4. 【POJ - 3669】Meteor Shower(bfs)

    -->Meteor Shower Descriptions: Bessie听说有场史无前例的流星雨即将来临:有谶言:陨星将落,徒留灰烬.为保生机,她誓将找寻安全之所(永避星坠之地).目前她正在平 ...

  5. 腾讯架构师分享的Java程序员需要突破的技术要点

    一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...

  6. springcloud-注册中心快速构建

    1. 场景描述 springcloud提供了一整套可行的构建分布式系统的方案,使的企业/开发人员能够快速沟通分布式系统,今天快速构建下springcloud的注册中心Eureka. 2. 解决方案 2 ...

  7. 利用Docker搭建Redis集群

    Redis集群搭建 运行Redis镜像 分别使用以下命令启动3个Redis docker run --name redis-6379 -p 6379:6379 -d hub.c.163.com/lib ...

  8. [记录]HAproxy负载均衡配置教程

    HAproxy负载均衡配置教程 一.简介 haproxy是一个开源的高性能负载均衡软件:支持双机热备.虚拟主机和图形化的管理界面,自带强大的对RS健康检查功能:支持TCP(四层).HTTP(七层)应用 ...

  9. Java 8 终于支持 Docker!

    Java 8曾经与Docker无法很好地兼容性,现在问题已消失. 请注意:我在本文中使用采用GNU GPL v2许可证的OpenJDK官方docker映像.在Oracle Java SE中,这里描述的 ...

  10. 个人永久性免费-Excel催化剂功能第31波-数量金额分组凑数功能,财务表哥表姐最爱

    在财务工作过程中,很大时候需要使用到凑数的需求,花了两三天时间认真研究了一下,本人水平也只能做代码搬运工,在用户体验上作了一下完善.完成了Excel版的凑数功能. 文章出处说明 原文在简书上发表,再同 ...