覆盖DisplayNameFor()的默认约定

时间:2018-08-03 10:33:09

标签: c# asp.net-core displayname-attribute

我有很多带有PascalCase名称的属性名称。

例如:

public string ProposalNotes { get; set; }

我将覆盖默认的Html.DisplayNameFor()方法以自动将属性名称拆分为“投标说明”,而不必添加如下显示属性:

[Display(Name = "Proposal Notes")]

当我需要重写此新约定时,我希望DisplayName属性仍然可以使用。例如,当我具有“ PgCodeInst”到“机构代码”之类的属性名称时。

有什么办法吗?

我还记得有关如何做类似事情的教程,但是找不到。

1 个答案:

答案 0 :(得分:1)

当然有可能,但是我只是仔细研究了源代码,我认为您会发现它所带来的麻烦远远超出了其价值。您必须从多个类中派生并重写其上的方法,然后您必须连接所有自定义内容以代替内置函数。

添加printf ("The 8 chars: %*.*s\n", min, max, "String that you want to limit"); 属性并不是真正的负担,坦率地说,它的意图更加明确,这始终是一件好事。但是,如果您对使用它一无所知,则可以考虑使用Humanizer之类的库,然后执行以下操作:

Display

FWIW,您需要在视图(@nameof(Model.ProposalNotes).Titleize(); )中添加using语句,但是您只能在@using Humanizer中执行一次。

此外,根据您实际上想要的名称,您始终可以创建一个custom tag helper。例如,要自动使用标签执行此操作,您可以简单地从LabelTagHelper继承(或创建自己的标签),并使用自己的自定义逻辑来确定显示名称以显示那里,而不是担心更改_ViewImports.cshtml之类的行为。您还可以创建一个自定义标签帮助程序,以仅输出上述标题名称:

DisplayNameFor

然后:

public class TitleizeTagHelper : TagHelper
{
    const string ForAttributeName = "asp-for";

    [HtmlAttributeName(ForAttributeName)]
    public ModelExpression For { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "span";
        output.SetContent(For.Name.Titleize());
    }
}

诚然,对于这么简单的事情来说,这有点过头了,但是如果确实应用了属性,那么可以通过窃用<titleize asp-for="ProposalNotes" /> 中的逻辑来支持自定义显示名称来增强它。