Переопределить соглашение по умолчанию для DisplayNameFor()
У меня есть много имен свойств с именами PascalCase.
Например:
public string ProposalNotes { get; set; }
Я переопределил метод Html.DisplayNameFor() по умолчанию, чтобы автоматически разделять имена свойств на "Примечания к предложению" без необходимости добавлять атрибуты отображения, как показано ниже:
[Display(Name = "Proposal Notes")]
Я хочу, чтобы атрибуты DisplayName все еще работали, когда мне нужно переопределить это новое соглашение. Например, когда у меня есть имена свойств от "PgCodeInst" до "Institution Code".
Есть ли способ сделать это?
Я помню учебник о том, как сделать что-то подобное, но не могу его найти.
1 ответ
Это, конечно, возможно, но я просто немного покопался в источнике, и я думаю, вы найдете в нем гораздо больше проблем, чем оно того стоит. Есть несколько классов, из которых вы должны получить производные и переопределить методы, а затем вам нужно будет подключить все ваши собственные элементы вместо встроенных.
Добавление Display
Атрибут на самом деле не так уж и обременителен, и, честно говоря, он немного более явный в своем намерении, что всегда хорошо. Однако, если вы не можете использовать его, вы можете вместо этого рассмотреть возможность использования библиотеки, такой как Humanizer, и просто сделать что-то вроде:
@nameof(Model.ProposalNotes).Titleize();
FWIW, вам нужно добавить оператор использования в ваше представление (@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
для поддержки пользовательских отображаемых имен, если атрибут действительно применяется.