TagHelper又是一个新的名词,它替代了自之前MVC版本的HtmlHelper,专注于在cshmlt中辅助生成html标记。

通过使用自定义的TagHelper可以提供自定义的Html属性或元素,借助服务端强大的编程API,使得cshtml的页面标记功能更加强大。

利用自定义标记赋予元素功能或添加属性的方式,跟Angular有点类似。

在MVC Core中内置的很多asp-XXX开头的TagHelper,后续再介绍,这里重点看看如何定义自己的TagHelper。

我们通过定义一个简单的TagHelper来描述他的基本用法:

项目准备

还是基于ASP.NET MVC Core Starter Kit的项目模板创建一个示例项目,具体怎样用请参考链接中的介绍。

1.这个TagHelper的目的是提供一个设置button样色的自定义属性标记,有这个标记的html元素将自动设置对应的css样式。

<button type="submit" bs-button-color="danger">Add</button>

这里定义的自定义属性是bs-button-color,我们预期生成的html是

<button type="submit" class="btn btn-danger">Add</button>

接下来创建TagHelper类,新建一个TagHelpers目录,新建一个ButtonTagHelper类,如下

public class ButtonTagHelper : TagHelper
{
public string BsButtonColor { get; set; } public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.Attributes.SetAttribute("class", $"btn btn-{BsButtonColor}");
}
}

这个短小的类,根据程序员的思维可以推导出大概的意思

a.BsButtonColor这个属性匹配的是bs-button-color这个属性标记,在运行时会将html属性转化成C#对象的属性

b.然后BsButtonColor的值通过html提供,然后在Process中使用

c.Process方法设置目标元素的class

d.其中TagHelperContext和TagHelperOutput提供了适用的API,拯救了程序员,里面的属性或者方法够我们改变世界了。

当然这样做的话,会让人产生疑问,那岂不是每个元素都要去匹配一下,没错这是默认的行为,后面会提到如何缩小查找范围。

对于这样的功能,如果使用老版本的HtmlHelper实现,那么会看起来不那么Html,比如上述的功能用HtmlHelper的实现方式类似如下方式

@Html.TextBoxFor(m => m.Population, new { @class = "form-control" } )

那么这个写法对于前端开发人员就不那么友好了,毕竟别人不同什么是@Html.TextBoxFor,bs-button-color这种方式更加直接,对html的入侵从视觉上来看更加的友好。

2 注册TagHelper

光定义还不行,还得注册让MVC知道这个自定义的TagHelper。

打开_ViewImports.cshtml,改成如下内容

@using CustomTagHelper.Models
@addTagHelper CustomTagHelper.TagHelpers.*, CustomTagHelper

其中第二行尤为重要,其目的是说明将我们定义的TagHelper添加注册到页面中,这样页面就能识match到。

注册完之后就能调用使用了,我们把自定义的TagHelper应用到Home/Create.cshtml的Add按钮

<button type="submit" bs-button-color="danger">Add</button>

运行之后效果,查看html可以得知已经生效

3 设置TagHelper的应用范围

刚才我们提到在匹配TagHelper的时候是使用元素类型去匹配,比如我们这里的ButtonTagHelper,会匹配所有的buttton。但实际上这不是我们需要的,我们只希望出现了自定义html标记属性的元素才应用这个TagHelper。

MVC Core为我们提供了HtmlTargetElement属性标记类解决这个问题,让TagHelper的应用更加的精准。

我们更新ButtonTagHelper,加入HtmlTargetElement属性

[HtmlTargetElement("button", Attributes = "bs-button-color", ParentTag = "form")]
public class ButtonTagHelper : TagHelper
{
public string BsButtonColor { get; set; } public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.Attributes.SetAttribute("class", $"btn btn-{BsButtonColor}");
}
}

看看HtmlTargetElement的定义,也是一目了然

1 第一个参数是tag类型

2 Attributes定义用于选择匹配应用元素的属性

3 ParentTag,设置必须是某个html的子元素才设置

当然有了HtmlTargetElement做护航,我们除了可以缩小范围,当然也可以用它来扩大影响范围。

比如我们把第一个tag参数去掉,那么就是应用到所有的元素类型(当然也要满足Attributes和ParentTag条件)

然后把tag参数去掉之后,发现范围太大不好管控,万一使用者不知道这范围定义,那么就会导致样式错误,并且这种bug不好跟,一旦发生也是个坑。

所以既要支持多种tag,又不能污染太多,那么就再apply一个HtmlTargetElement属性,比如如下

[HtmlTargetElement("button", Attributes = "bs-button-color", ParentTag = "form")]

[HtmlTargetElement("a", Attributes = "bs-button-color", ParentTag = "form")]
public class ButtonTagHelper : TagHelper
{
public string BsButtonColor { get; set; } public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.Attributes.SetAttribute("class", $"btn btn-{BsButtonColor}");
}
}

这里用了两个HtmlTargetElement,指明了只有button和a元素可以应用这个tagHelper,后续哪个人复制粘贴到了其他tag也不会受影响。

示例代码

https://github.com/shenba2014/AspDotNetCoreMvcExamples/tree/master/CustomTagHelper

先写到这,下一篇将介绍一些稍微高级一点用法。

ASP.NET MVC Core的TagHelper(基础篇)的更多相关文章

  1. ASP.NET MVC Core的TagHelper (高级特性)

    这篇博文ASP.NET MVC Core的TagHelper(基础篇)介绍了TagHelper的基本概念和创建自定义TagHelper的方式,接着继续介绍一些新的看起来比较高级的特性.(示例代码紧接着 ...

  2. ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0

    ASP.NET 5.0 将改名为 ASP.NET Core 1.0 ASP.NET MVC 6  将改名为 ASP.NET MVC Core 1.0 Entity Framework 7.0    将 ...

  3. [转帖]2016年时的新闻:ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0

    ASP.NET Core 1.0.ASP.NET MVC Core 1.0和Entity Framework Core 1.0 http://www.cnblogs.com/webapi/p/5673 ...

  4. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  5. ASP.NET MVC Core Starter Kit

    上一篇博文<创建.NET Core程序的Nuget Package>提到准备创建一个Nuget包,用于自动生成一个简单的ASP.NET MVC Core的示例项目.本来是打算用Nuget实 ...

  6. ASP.NET MVC 3.0 Controller基础

    ASP.NET MVC 3.0 Controller基础   1.Controller类与方法 Controller(控制器)是ASP.NET MVC的核心,负责处理浏览器请求,并作出响应.Cotro ...

  7. 通过扩展改善ASP.NET MVC的验证机制[实现篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[实现篇] 在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持, ...

  8. 通过扩展改善ASP.NET MVC的验证机制[使用篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[使用篇] ASP.NET MVC提供一种基于元数据的验证方式是我们可以将相应的验证特性应用到作为Model实体的类型或者属性/字段上,但是这依然具有 ...

  9. .NET CORE学习笔记系列(1)——ASP.NET MVC Core 介绍和项目解读

    ASP.NET MVC Core 项目文件夹解读 一.项目文件夹总览 1.1.Properties——launchSettings.json 启动配置文件,你可以在项目中“Properties”文件夹 ...

随机推荐

  1. leetcode 移除元素

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  2. Android : M 与 N 的权限管理

    从 M 开始,permission 分为 Normal permission Runtime permission Normal permission 直接在 manifest 里声明就可以用了. a ...

  3. Android 中 LayoutParams 的用法

    一个控件应当使用它的父控件的 LayoutParams 类型.因此,一个 TableVow 应该使用 TableLayout.Params . 所以,以一个 TableRow 为例: TableRow ...

  4. 如何让Gogland不过期,一直使用?

    Gogland是jetBrains公司出品的GO语言开发IDE,是目前最好的GO语言开发工具!!但是目前Gogland提供的试用版,有一定的使用期限,如何到期还能使用?经过我的测试,如果Gogland ...

  5. 内置函数——sorted

    对List.Dict进行排序,Python提供了两个方法对给定的List L进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2.用built-in函数sorted ...

  6. mongodb 备份脚本

    ###############备份脚本#!/bin/bash basepath="/data/backup/dump$(date +%Y%m%d%H%M%S)" if [ ! -d ...

  7. 【OCP-12c】CUUG 071题库考试原题及答案解析(16)

    16.(7-5) choose the best answerThe PRODUCTS table has the following structure:Evaluate the following ...

  8. Servlet入门实践

    本文主要介绍servlet,包括入门到升入,基本上可以对servlet有一个很好的认识: 1servlet介绍:   Servlet(Server Applet),全称Java Servlet,未有中 ...

  9. eclipse安装SonarLint插件,sonarLint客户端的使用

    一.在线安装sonarLint 打开eclipse里的help->Eclipse Marketplace,搜索“sonar”关键字,目前sonar的插件是sonarlint,如下图: 点击“In ...

  10. git配置教程

    一.配置ssh 1.检查本机是否有ssh key设置 如果没有则提示: No such file or directory 如果有则进入~/.ssh路径下(ls查看当前路径文件,rm删除所有文件) 2 ...