我有很多带有PascalCase名称的属性名称。
例如:
public string ProposalNotes { get; set; }
我将覆盖默认的Html.DisplayNameFor()方法以自动将属性名称拆分为“投标说明”,而不必添加如下显示属性:
[Display(Name = "Proposal Notes")]
当我需要重写此新约定时,我希望DisplayName属性仍然可以使用。例如,当我具有“ PgCodeInst”到“机构代码”之类的属性名称时。
有什么办法吗?
我还记得有关如何做类似事情的教程,但是找不到。
答案 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" />
中的逻辑来支持自定义显示名称来增强它。