为了账号安全,请及时绑定邮箱和手机立即绑定

覆盖 DisplayNameFor() 的默认约定

覆盖 DisplayNameFor() 的默认约定

C#
婷婷同学_ 2021-11-14 14:46:39
我有很多带有 PascalCase 名称的属性名称。例如:public string ProposalNotes { get; set; }我在覆盖默认的 Html.DisplayNameFor() 方法后自动将属性名称拆分为“提案注释”,而无需添加如下显示属性:[Display(Name = "Proposal Notes")]当我需要覆盖这个新约定时,我希望 DisplayName 属性仍然有效。例如,当我有像“PgCodeInst”到“机构代码”这样的属性名称时。有没有办法做到这一点?我记得有一个关于如何做类似事情但找不到的教程。
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

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


添加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如果实际应用了该属性,您也可以通过窃取支持自定义显示名称的逻辑来加强它。


查看完整回答
反对 回复 2021-11-14
  • 1 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号