一、概述
上面的解释有点拗口?那么换一个名词,HtmlHelper大家都知道吧,在ASP.NET Core中,TagHelper类似HtmlHelper,但可以说是青出于蓝而胜于蓝。那么TagHelper的作用也就大概明白了吧。
首先通过一个例子看一下TagHelper是怎么使用的,看看它和HtmlHelper有什么区别。新建一个Book类:
public class Book { [Display(Name = "编号")] public string Code { get; set; } [Display(Name = "名称")] public string Name { get; set; } }
新建对应的Controller和Action:
public class BookController : Controller { // GET: /<controller>/ public IActionResult Index() { return View(new Book() { Code = "001", Name = "ASP" }); } }
最后就是View了:
@model Book @{ Layout = null; } @Html.LabelFor(m => m.Name) @Html.EditorFor(m => m.Name) <br /> <label asp-for="Name"></label> <input asp-for="Name" />
这里分别通过HtmlHelper和TagHelper两种方式实现了一个文本和输入框的显示。查看网页源代码,可以看到二者生成的HTML如下:
1.<label for="Name">Name</label> <input class="text-box single-line" id="Name" name="Name" type="text" value="ASP" /> <br/> <label for="Name">Name</label> <input type="text" id="Name" name="Name" value="ASP" />
目前看起来二者差不多,从工作量上来看也是区别不大。现在功能实现了,需要做一些样式处理。简单举个例子,现在希望Book的编号(Code)对应的label的颜色设置为红色,定义了一个css如下:
<style type="text/css"> .codeColor { color:red; } </style>
然后准备把这个样式应用到label上,这时如果是HtmlHelper就很有可能会被问:“class写在哪”,估计好多人都被问过。然后我们告诉他可以这样写:
@Html.LabelFor(m=>m.Name,new {@class="codeColor"})
前端工程师添加后达到了想要的效果,但同时表示记不住这个写法,下次可能还会问。
如果是TagHelper就方便了,告诉他可以像平时给Html的标签添加class一样操作即可,也就是:
<label asp-for="Name" class="codeColor"></label>
前端工程师表示这种写法“真是太友好了”。同样对于Form及验证,比较一下两种写法的不同,HtmlHelper版:
1.@using (Html.BeginForm("Index", "Home", FormMethod.Post)){ @Html.LabelFor(m => m.Code) @Html.EditorFor(m => m.Code) @Html.ValidationMessageFor(m => m.Code) <input type="submit" value="提交" /> }
TagHelper版:
<form asp-action="Index" asp-controller="Home" method="post"> <label asp-for="Code"></label> <input asp-for="Code" /> <span asp-validation-for="Code"></span> <input type="submit" value="提交" /> </form>