.NET Tag Helper复制@ Html.DisplayFor

时间:2018-03-17 22:45:52

标签: html-helper asp.net-core-tag-helpers

我正在发现.Net核心标记助手,我很想知道是否有任何标记助手可以复制@Html.DisplayFor。我认为label tag helper复制@Html.DisplayNameFor,因为它在传递给页面的模型上显示了属性名称,但是有@Html.DisplayFor的等价物用于显示属性值吗?

我假设没有,因为在microsoft .net核心教程中,需要显示属性值而不是属性名称的razor页面使用HTML帮助程序。

1 个答案:

答案 0 :(得分:0)

首先,标签帮助程序实际上是“ asp-for标签”。您可以创建一个新的标签帮助程序,它是“标签asp文本”帮助程序。

另一种选择是使用诸如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