asp.net-core - 在 ASP.NET Core MVC 中使用 Tag Helpers 有什么好处

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

我刚刚看到一篇关于 ASP.NET Core 新特性的好文章,名为 Tag helpers .

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

@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-controller , asp-for等等。但是它有什么作用呢?这种新方法的优势是什么?

最佳答案

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

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

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

生成的 HTML 标记如下所示:
<input class="form-control" id="Name" name="Name" type="text" value="">

很好很简单。但是如果你想添加一个占位符属性呢?如果你想使用 Bootstrap 的验证状态怎么办?如果您有一些需要自定义属性的第三方超酷 javascript 库怎么办。这些事情在 中都不可能发生。初始版本 MVC5。 尽管它们最终是通过更新以 的形式添加的html属性 .即使现在添加自定义属性充其量也是杂乱无章的。
@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 的问题,需要修复。希望标签助手的实现足够完整,我们将来可以避免它们。

关于asp.net-core - 在 ASP.NET Core MVC 中使用 Tag Helpers 有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29005877/

相关文章:

c# - 如何在 EF Core 中使用 C# 9 记录?

c# - 使用HttpClient.GetFromJsonAsync(),如何处理基于HttpStatusCode的HttpRequestException而无需额外的SendAsync调用?

mysql - 使用 EFCore 在多个表中选择

oauth-2.0 - 使用 Identity Core 颁发不记名 JWT token

c# - 如何在 Asp.net MVC 6 中使用 NHaml(找不到模板错误)

c# - 如何修复 Microsoft Botframework v4 中的 'DataTable' 不包含 'AsEnumerable' 错误的定义?

azure - 从 ASP.NET Core 填充 Application Insights 中的用户 ID 字段

c# - 无法绑定(bind)字符串索引查询字符串参数

asp.net-core - 使用 UseJwtBearerAuthentication 中间件自定义 401 和 403 响应模型

asp.net-core - 如何在中间件类中访问 IHostingEnvironment