【问题标题】:.NET Tag Helper to replicate @Html.DisplayFor.NET Tag Helper 复制 @Html.DisplayFor
【发布时间】:2018-03-17 22:45:52
【问题描述】:
我正在发现 .Net Core Tag Helpers,我只是想知道是否有任何标签助手可以复制 @Html.DisplayFor。我认为label tag helper 复制了@Html.DisplayNameFor,因为它显示了传递给页面的模型上的属性名称,但是@Html.DisplayFor 是否有等价物来显示属性值?
我假设没有,因为在 microsoft .net 核心教程中,需要显示属性值而不是属性名称的 razor 页面使用 HTML 帮助程序。
【问题讨论】:
标签:
html-helper
asp.net-core-tag-helpers
【解决方案1】:
首先,标签助手实际上是“标签 asp-for”。您可以创建一个新的标签助手,它是一个“标签 asp-text”助手。
另一种选择是使用另一个标签,例如 span,并创建一个自定义的“span asp-for”标签助手。
这是一个简单的 span 实现:
[HtmlTargetElement("span", Attributes = FOR_ATTRIBUTE_NAME, TagStructure = TagStructure.NormalOrSelfClosing)]
public class CustomSpanTagHelper : InputTagHelper
{
private const string FOR_ATTRIBUTE_NAME = "asp-for";
public CustomSpanTagHelper(IHtmlGenerator generator) : base(generator)
{
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (output == null)
{
throw new ArgumentNullException(nameof(output));
}
var metadata = base.For.Metadata;
if (metadata == null)
{
throw new InvalidOperationException(string.Format("No provided metadata " + FOR_ATTRIBUTE_NAME));
}
if (!string.IsNullOrWhiteSpace(metadata.Description))
{
output.Content.Append(metadata.Description);
}
if (metadata.IsEnum)
{
var description = (this.For.Model as Enum).GetDescription();
output.Content.Append(description);
}
base.Process(context, output);
}
}
您需要像这样在 _ViewImports.cshtml 中注册您的自定义标签助手:(不要忘记重新构建)
@namespace MyProject.Web.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper MyProject.Web.TagHelpers.CustomSpanTagHelper, MyProject.Web <-- custom import