猿问

覆盖 DisplayNameFor() 的默认约定

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

例如:

public string ProposalNotes { get; set; }

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

[Display(Name = "Proposal Notes")]

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

有没有办法做到这一点?

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


婷婷同学_
浏览 155回答 1
1回答

函数式编程

这当然是可能的,但我只是稍微挖掘了一下源代码,我认为你会发现它比它的价值要麻烦得多。您必须从多个类派生并覆盖方法,然后您必须连接所有自定义内容来代替内置函数。添加Display属性并不是真正的负担,坦率地说,它的意图更加明确,这总是一件好事。但是,如果您坚决反对使用它,您可以考虑使用像Humanizer这样的库,然后执行以下操作:@nameof(Model.ProposalNotes).Titleize();FWIW,您需要将 using 语句添加到您的视图 ( @using Humanizer),但您只能在_ViewImports.cshtml.此外,根据您实际想要的显示名称,您始终可以创建自定义标签助手。例如,要使用标签自动执行此操作,您可以简单地继承LabelTagHelper(或创建您自己的)并使用您自己的自定义逻辑来确定要在那里显示的显示名称,而不必担心更改诸如DisplayNameFor. 您还可以创建一个自定义标签助手来输出上面的标题名称:public class TitleizeTagHelper : TagHelper{&nbsp; &nbsp; const string ForAttributeName = "asp-for";&nbsp; &nbsp; [HtmlAttributeName(ForAttributeName)]&nbsp; &nbsp; public ModelExpression For { get; set; }&nbsp; &nbsp; public override void Process(TagHelperContext context, TagHelperOutput output)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; output.TagName = "span";&nbsp; &nbsp; &nbsp; &nbsp; output.SetContent(For.Name.Titleize());&nbsp; &nbsp; }}然后:<titleize asp-for="ProposalNotes" />诚然,这对于如此简单的事情来说有点矫枉过正,但是LabelTagHelper如果实际应用了该属性,您也可以通过窃取支持自定义显示名称的逻辑来加强它。
随时随地看视频慕课网APP
我要回答