我刚刚看到一篇关于 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/