Asp.net core 在ASP.NET核心MVC中使用标记帮助程序的优势是什么

Asp.net core 在ASP.NET核心MVC中使用标记帮助程序的优势是什么,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,我刚刚看到一篇关于ASP.NET核心特性的好文章,名为 从那里,我了解到可以替换以下代码: @model MyProject.Models.Product @using (Html.BeginForm()) { <div> @Html.LabelFor(m => p.Name, "Name:") @Html.TextBoxFor(m => p.Name) </div> <input type="s

我刚刚看到一篇关于ASP.NET核心特性的好文章,名为

从那里,我了解到可以替换以下代码:

@model MyProject.Models.Product

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(m => p.Name, "Name:")
        @Html.TextBoxFor(m => p.Name)
    </div>
    <input type="submit" value="Create" />
}
@model MyProject.Models.Product
@使用(Html.BeginForm())
{
@LabelFor(m=>p.Name,“Name:”)
@Html.TextBoxFor(m=>p.Name)
}
与:

@model MyProject.Models.Product
@addtaghelper“Microsoft.AspNet.Mvc.TagHelpers”
姓名:

有一些新的语法,例如
asp-controller
asp-for
,但是它做什么呢?这种新方法的优点是什么?

到目前为止,我看到的最重要的改进是它保证了对HTML元素的控制。MVC使用的Html帮助程序虽然方便,但在您尝试执行它们不是为之构建的事情时会产生问题

在MVC5中使用文本框时可以看到一个简单的示例:

 @Html.TextBoxFor(m => p.Name)
生成的HTML标记如下所示:

<input class="form-control" id="Name" name="Name" type="text" value="">
虽然您可能会争辩说,这仍然不是直接的HTML代码,但它不再是一个显著的优势。更糟糕的是,此解决方案仍然没有覆盖相当常见的属性中的破折号。如果您需要它们,您将不得不使用一种变通方法,例如

我已经用自定义编辑器修复了这些缺陷,并尝试构建自己的文本框控件。很快,替换包含的文本框模板将需要大量工作。更糟糕的是,您的模板必须了解要使用它们而添加的任何扩展


MVC中包含了引导和其他第三方工具,这似乎使得当前的设计在扩展HTML方面存在问题变得更加明显,需要解决这些问题。希望tag helpers的实现足够完整,我们可以在将来避免它们。

想到一些事情:

  • 正如@ChrisWalter所指出的,这些标记帮助器为HTML标记提供了一种开放/封闭的特性。您可以扩展HTML元素,而不仅仅是让您为常见的HTML模式编写扩展方法。这使您可以选择并混合每个组件的多个扩展,而不必在它们之间进行选择
  • 对于需要提供内部HTML作为参数的元素,HTML帮助程序往往不能很好地工作。他们想出了一个聪明的模式,你可以说:

    @using (Html.BeginForm(...)){
    {
        <input ... />
    }
    
    @使用(Html.BeginForm(…){
    {
    }
    
    但是关于
    BeginForm()
    没有任何东西会强迫您使用
    语句将其放入
    中,也没有任何东西可以阻止您使用不正确的HTML结构。(
    从技术上讲,它直接位于
    标记中。)

  • 这为我们进入HTML5的Web组件世界提供了一个非常简单的过渡垫脚石。您今天为jQuery或Bootstrap编写的组件在几年后作为Angle 2或Polymer组件可能会更有意义。使用HTML语法可以按照您希望的方式编写HTMLeb组件,并将其自动转换为目前(或以后针对特定浏览器)必须采用的结构

  • 更不用说,你的网页设计师将有真正的HTML标签可供编辑,他们可以识别这些标签来重新设计你的网页。设计师不必是编码员,他们有足够的时间来跟上,研究HTML5和CSS3规范的移动目标。

    你问你的问题,我也在想同样的事情……甚至从已经提供的答案来看,是的,我得到了一些答案,但仍然感觉52(标签)/48更好
    @Html.TextBoxFor(m => p.Name, 
        new {@class="form-control has-error", placeholder="Enter Name", 
        superCoolFeature="Do something cool"})
    
    @using (Html.BeginForm(...)){
    {
        <input ... />
    }