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. Dockerfile文件参数详解

    参考: https://www.jianshu.com/p/e4b31ca37043 https://blog.csdn.net/u010246789/article/details/54139168 ...

  2. sharepoint database 操作

    select *from [dbo].[AllLists] where tp_Title='Pages' and tp_WebId='90511126-E1FE-4E4C-8DDF-74DFC89E8 ...

  3. Enabling Remote Errors in SSRS

    January 18, 2011 By default the remote errors property in SQL Server Reporting Services is set to fa ...

  4. ESXi到KVM之v2v迁移

    1.ESXi到KVM之v2v情况说明 (1).配置任务列表: 1)VMwareESXi虚拟平台下linux系统迁移到KVM虚拟平台.2)VMwareESXi虚拟平台下windows系统迁移到KVM虚拟 ...

  5. HDU 3007 模拟退火算法

    Buried memory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. samba服务器的安装与配置(之前是因为没有把共享文件权限放开!)(windows7和centOS6)

    注:centOS6跟centOS7安装方法不一样哦.以下是centOS6的安装过程. 安装:yum -y install samba 启动:/etc/init.d/smb start 设置开机启动:c ...

  7. (转)使用VS实现XML2CS

    转自 StackOverFlow Method 1 XSD tool Suppose that you have your XML file in this location C:\path\to\x ...

  8. 【Jenkins】定时构建语法

    跟cron定时任务语法基本类似 一.字段有哪些 每行包含5个字段,用制表符或空格隔开,从左至右依次是: 分 时 天 月 星期 二.每个字段的取值范围 分钟 (0–59) 时 (0–23) 天 (1–3 ...

  9. 2018-2019 20165226 Exp7 网络欺诈防范

    2018-2019 20165226 Exp7 网络欺诈防范 目录 一.实验内容说明及基础问题回答 二.实验过程 1.简单应用SET工具建立冒名网站 2.ettercap DNS spoof 3.结合 ...

  10. Matplotlib的初次使用

    # -*- coding: utf-8 -*-#先画一个线性图 import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] p ...