概要
TagHelper是ASP.NET 5的一个新特性。也许在你还没有听说过它的时候, 它已经在技术人员之间引起了大量讨论,甚至有一部分称它为服务器控件的回归。实际上它只不过是一个简化版本,把HTML和服务器内容混合在一起,没有控件生命周期,状态保持和事件。它不像服务器控件那样,对页面所有内容都具有访问权限。它只能访问到自己所生成的内容。
什么是TagHelper?
我们曾经在MVC项目中使用在HtmlHelps。比如当需要在View上添加一个导航栏的时候,我们就会添加下面代码到页面上去:
<ol>
…
<li>@Html.ActionLink("Home", "Index", "Home")<li>
…
</ol>
这里有一些HTML元素。还有以@开头的一些C#代码,当View解析的时候这些C#代码会被解析成HTML元素。
当我们用TagHelper,我们同样可以用下面的代码来获得上面同样的效果:
<ol>
…
<li><a controller="Home" action="Index">Home</a></li>
…
</ol>
在这里,A元素的属性controller和action并不是HTML5的属性,而是这个TagHelper的属性。
这里需要着重申明一点是,虽然TagHelper看起来有点像我们之前服务器控件的写法,但是它不是服务器控件的再次回归。它更像是给用户一个简洁的方式来表达用户的意向。它本身并没有生命周期之类的东西。它会预处理服务器内容,然后赋值给相应的属性。我们来看一下关于微软提供的SelectTagHelper的一个用法:
<select asp-for="Country" asp-items="ViewBag.Countries">
其中文本“Country”被赋给asp-for属性,变量ViewBag.Countries被赋给属性asp-items.
怎么使用TagHelpers?
关于如何使用TagHelpers,我们可以参照一下几步:
- 在project.json文件中添加具有TagHelpers的package的依赖;
- 在所用的View上注册TagHelper:
@addTagHelper “[the full type name of taghelper,] the assembly name”
第一参数是TagHelper类的全名,当你只需要使用某一个TagHelper时候,你可以在此指定你所用的TagHelper类全名,包括它的NameSpace。如果你要使用程序集中所有的TagHelpers,在这里你可以使用“*”或者省略这一个参数。举个例子,如果你需要使用微软提供的TagHelpers可以通过添加下面的代码在注册:
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
或者
@addTagHelper "Microsoft.AspNet.Mvc.TagHelpers"
如果你只希望使用AnchorTagHelper,那么只需要一下代码:
@addTagHelper "Microsoft.AspNet.Mvc.TagHelpers.AnchorTagHelper, Microsoft.AspNet.Mvc.TagHelpers"
第二个参数是程序集名。
当然,如果你想取消某个TagHelper的注册,可以使用removeTagHelper,比如@removeTagHelper "Microsoft.AspNet.Mvc.TagHelpers.AnchorTagHelper, Microsoft.AspNet.Mvc.TagHelpers"
一旦TagHelper被取消注册了,其对应的Tag就不能被解析成这种TagHelper了。
- 在View中需要使用的地方添加TagHelper,比如我们添加一个AnchorTagHelper:
<a asp-controller="Home" asp-action="About">About</a>
写在本文的结尾
以上介绍了TagHelper的一些基本知识,这是知识是基于ASP.NET5 beta4的,ASP.NET5还在开发之中,现在已经发布了beta5,有些东西也是一直在变化,所以可能上面写到的某些方法名,程序集名在新的版本都发生了变化,这一点需要注意。
接下来我会介绍关于微软已经给我们提供的一些TagHelpers和如何开发自己的TagHelper。