【问题标题】:What is the advantage of using Tag Helpers in ASP.NET Core MVC在 ASP.NET Core MVC 中使用 Tag Helpers 有什么好处
【发布时间】:2015-05-14 09:06:21
【问题描述】:

我刚刚看到一篇关于名为 Tag helpers 的新 ASP.NET Core 功能的好文章。

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

@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
@addtaghelper "Microsoft.AspNet.Mvc.TagHelpers"

<form asp-controller="Products" asp-action="Create" method="post">
    <div>
        <label asp-for="Name">Name:</label>
        <input asp-for="Name" />
    </div>

    <input type="submit" value="Save" />
</form>

有一些新语法,例如asp-controllerasp-for 等。但它有什么作用呢?这种新方法的优势是什么?

【问题讨论】:

  • 你问你的问题我完全想知道同样的事情......即使从提供的答案中我得到了一些,但仍然感觉像 52(tag)/48 更好

标签: asp.net-core asp.net-core-mvc


【解决方案1】:

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

在MVC5中使用TextBox时可以看到一个简单的例子:

 @Html.TextBoxFor(m => p.Name)

生成的 HTML 标记如下所示:

<input class="form-control" id="Name" name="Name" type="text" value="">

漂亮而简单。但是如果你想添加一个占位符属性呢?如果你想使用引导程序的验证状态怎么办?如果您有一些需要自定义属性的第三方超酷 javascript 库怎么办。这些事情在 MVC5 的初始版本 中都不可能实现。 尽管它们最终是通过更新以 htmlAttributes 的形式添加的。即使是现在添加自定义属性充其量也是杂乱无章的。

@Html.TextBoxFor(m => p.Name, 
    new {@class="form-control has-error", placeholder="Enter Name", 
    superCoolFeature="Do something cool"})

虽然您可能会争辩说这仍然比纯 HTML 代码更少,但它不再是一个显着的优势。更糟糕的是,这个解决方案仍然没有涵盖相当常见的属性中的破折号。如果您需要它们,您会遇到诸如ActionLink htmlAttributes

之类的解决方法

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

似乎将 Bootstrap 和其他 3rd 方工具包含到 MVC 中,更明显地表明当前设计存在扩展 HTML 的问题,需要修复。希望标签助手的实现足够完整,我们将来可以避免它们。

【讨论】:

    【解决方案2】:

    更不用说,您的Web 设计师 将拥有真正的 HTML 标签来编辑,他们可以识别这些标签来重新设计您的页面。设计师不必是编码人员,这些精明的人足以跟上,研究 HTML5 和 CSS3 规范的移动目标。

    【讨论】:

      【解决方案3】:

      我想到了一些事情:

      1. 正如@ChrisWalter 指出的那样,这些标签助手为HTML 标签提供了打开/关闭的质量。您可以扩展一个 HTML 元素,而不仅仅是让您为常见的 HTML 模式编写扩展方法。这使您可以为每个组件挑选和混合多个扩展,而不必在它们之间进行选择。
      2. HTML Helpers 对于需要将内部 HTML 作为参数提供的元素往往效果不佳。他们想出了一个聪明的模式,所以你可以说:

        @using (Html.BeginForm(...)){
        {
            <input ... />
        }
        

        但是BeginForm() 没有任何东西会迫使您将其放入using 语句中,也没有什么可以阻止您使用不正确的HTML 结构。 (&lt;input&gt; 技术上 isn't allowed 直接在 &lt;form&gt; 标记内。)

      3. 这为我们进入 HTML5 的 Web 组件世界提供了一个非常简单的过渡垫脚石。您今天为 jQuery 或 Bootstrap 编写的组件以获取和增强可能在几年后作为 Angular 2 或 Polymer 组件更有意义。使用 HTML 语法可以按照您希望它作为 Web 组件时的外观来编写您的 HTML,并自动将其转换为现在必须采用的结构(或稍后针对特定浏览器)。

      【讨论】:

        【解决方案4】:

        接受的答案是正确的,但只是一个更正。 Html Helpers 使用下划线覆盖属性中的破折号。例如,如果你想要 html 之类的 我的属性=值 然后你可以使用像 @Html.TextBoxFor(m=>m.id, 新 { my_attr = 值 }) 然后它会相应地转换。

        【讨论】:

        【解决方案5】:

        我知道最初的问题是关于优点,但为了完整起见,我不得不提一个缺点

        启用标签助手后,您无法在标签属性中注入 C# 代码。

        即此代码将中断:

        <!-- this won't work -->
        <input class="@GetMyClass()">
        
        <!-- this won't work too -->
        <input type="checkbox" @(condition ? "checked" : "") >
        

        要解决此问题,您可以使用自定义标签助手或完全禁用标签助手,如此答案中所述:https://stackoverflow.com/a/65281018/56621

        附:我的拙见可以安全地忽略:标签助手是“魔法”。而“魔法”在编程中总是不好的。如果某样东西看起来像一个 HTML 标签,走路像一个标签,嘎嘎声像一个标签——那么它可能应该是一个 HTML 标签。在我不知道“哦,它不是*真的*标签”的情况下。

        【讨论】:

          猜你喜欢
          • 2017-04-20
          • 2020-10-09
          • 1970-01-01
          • 2016-11-17
          • 2015-01-16
          • 2015-10-22
          • 2016-04-10
          相关资源
          最近更新 更多