1

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

例如:

public string ProposalNotes { get; set; }

我在覆盖默认 Html.DisplayNameFor() 方法以自动将属性名称拆分为“提案注释”之后,无需添加显示属性,如下所示:

[Display(Name = "Proposal Notes")]

当我需要覆盖这个新约定时,我希望 DisplayName 属性仍然有效。例如,当我有像“PgCodeInst”到“机构代码”这样的属性名称时。

有没有办法做到这一点?

我记得一个关于如何做类似但找不到的教程。

4

1 回答 1

1

这当然是可能的,但我只是稍微挖掘了一下来源,我认为你会发现它的麻烦远大于它的价值。您必须从多个类派生并覆盖方法,然后您必须连接所有自定义内容来代替内置函数。

添加Display属性并不是真正的负担,坦率地说,它的意图更加明确,这总是一件好事。但是,如果您坚决反对使用它,则可以考虑使用Humanizer之类的库,然后执行以下操作:

@nameof(Model.ProposalNotes).Titleize();

FWIW,您需要将 using 语句添加到您的视图 ( @using Humanizer),但您可以在_ViewImports.cshtml.

此外,根据您实际想要的显示名称,您始终可以创建一个自定义标签助手。例如,要使用标签自动执行此操作,您可以简单地继承自(或创建您自己的)并使用您自己的自定义逻辑来确定要在此处LabelTagHelper显示的显示名称,而不必担心更改诸如. 您还可以创建一个自定义标签助手以仅输出上述标题名称: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" />

诚然,对于如此简单的事情来说,这有点矫枉过正,但是LabelTagHelper如果实际应用了该属性,您也可以通过窃取支持自定义显示名称的逻辑来加强它。

于 2018-08-03T13:25:50.420 回答