Как подключить Humanizer к страницам Razor ASP.NET Core?
Я новичок в ASP.NET Core Razor Pages, и я пытаюсь подключить структуру Humanizer к конвейеру представления Razor Pages, используя
IDisplayMetadataProvider
. Я бы хотел, чтобы все мои представления преобразовывали свойства моей модели в строки "заголовка" на моих этикетках.
Например, я хотел бы сделать что-то вроде этого:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
С указанным выше определением класса я бы хотел, чтобы мои метки автоматически использовали Humanizer
To.TitleCase
в любое время я говорю
@Html.DisplayNameFor(...)
:
<div>
@Html.DisplayNameFor(m => m.FirstName)
@Html.DisplayFor(m => m.FirstName)
</div>
<div>
@Html.DisplayNameFor(m => m.LastName): @Html.DisplayFor(m => m.LastName)
</div>
Я ожидал увидеть:
First Name: Joe
Last Name: Smith
Решение (ОБНОВЛЕНО)
Мне удалось настроить это в классическом ASP.NET MVC, используя руководство в нижней части страницы Readme Humanizer (объяснено здесь). Побывав некоторое время в Интернете, я нашел этот пост Майкла Уилана:
public class HumanizerMetadataProvider : IDisplayMetadataProvider
{
public void CreateDisplayMetadata(DisplayMetadataProviderContext context)
{
var propertyAttributes = context.Attributes;
var modelMetadata = context.DisplayMetadata;
var propertyName = context.Key.Name;
if (IsTransformRequired(propertyName, modelMetadata, propertyAttributes))
modelMetadata.DisplayName = () => propertyName.Humanize().Transform(To.TitleCase);
}
private static bool IsTransformRequired(string propertyName, DisplayMetadata modelMetaData, IReadOnlyList<object> propertyAttributes)
{
if (!string.IsNullOrEmpty(modelMetaData.SimpleDisplayProperty))
return false;
if (propertyAttributes.OfType<DisplayNameAttribute>().Any())
return false;
if (propertyAttributes.OfType<DisplayAttribute>().Any())
return false;
if (string.IsNullOrEmpty(propertyName))
return false;
return true;
}
}
С интерфейсом потребовался немного другой подход, нежели наследование от класса. Это был трюк для подключения к конвейеру ASP.NET Core Razor Pages. Вот код, необходимый в Startup.cs
ConfigureServices(...)
обработчик:
services
.AddRazorPages()
.AddMvcOptions(m => m.ModelMetadataDetailsProviders.Add(new HumanizerMetadataProvider()));
Надеюсь, это кому-то поможет!
1 ответ
НАШЛИ ЭТО
Это была проблема PEBCAK. ♂️
Исправление было здесь:
if (!string.IsNullOrEmpty(modelMetaData.SimpleDisplayProperty))
return false;
После исправления оператора if "Первая попытка" сработала, как ожидалось.