Как подключить Humanizer к страницам Razor ASP.NET Core?

Я новичок в ASP.NET Core Razor Pages и пытаюсь подключить Humanizer framework в конвейер представлений 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()));

Надеюсь, это кому-то поможет!


person Luc    schedule 14.09.2020    source источник


Ответы (1)


НАШЛИ ЭТО

Это была проблема PEBCAK. ????‍♂️

Исправление было здесь:

  if (!string.IsNullOrEmpty(modelMetaData.SimpleDisplayProperty))
      return false;

После исправления оператора if первая попытка сработала должным образом.

person Luc    schedule 14.09.2020