C# 覆盖DisplayNameFor()的默认约定
我有很多带有PascalCase名称的财产名称 例如:C# 覆盖DisplayNameFor()的默认约定,c#,asp.net-core,displayname-attribute,C#,Asp.net Core,Displayname Attribute,我有很多带有PascalCase名称的财产名称 例如: public string ProposalNotes { get; set; } 我在重写默认的Html.DisplayNameFor()方法以自动将属性名称拆分为“建议注释”后,无需添加如下显示属性: [Display(Name = "Proposal Notes")] 我希望DisplayName属性在需要覆盖此新约定时仍然有效。例如,当我有像“PgCodeInst”到“机构代码”这样的财产名称时 有没有办法做到这一点 我记得有一
public string ProposalNotes { get; set; }
我在重写默认的Html.DisplayNameFor()方法以自动将属性名称拆分为“建议注释”后,无需添加如下显示属性:
[Display(Name = "Proposal Notes")]
我希望DisplayName属性在需要覆盖此新约定时仍然有效。例如,当我有像“PgCodeInst”到“机构代码”这样的财产名称时
有没有办法做到这一点
我记得有一篇关于如何做类似事情的教程,但找不到 这当然是可能的,但我只是对来源进行了一点挖掘,我想你会发现它的麻烦远远超过它的价值。您必须从多个类派生并重写这些类上的方法,然后您必须连接所有自定义内容来代替内置内容 添加
Display
属性实际上并不是一个很大的负担,坦率地说,它的意图更加明确,这总是一件好事。但是,如果你坚决反对使用它,你可能会考虑使用一个类库,然后做一些类似的事情:
@nameof(Model.ProposalNotes).Titleize();
FWIW,您需要将using语句添加到视图中(@using Humanizer
),但您可以在\u 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());
}
}
然后:
诚然,对于如此简单的东西来说,这有点过分了,但是您可以通过从
LabelTagHelper
中窃取逻辑来支持自定义显示名称,从而增强它,如果实际应用了该属性。是上的第二个链接。抱歉,我应该已经指出它是针对ASP.NET核心的。您能提供您使用的代码吗?我有一个想法,但我需要查看代码。处理方法的最后一行必须是output.Content.SetContent(…)
。
<titleize asp-for="ProposalNotes" />