【问题标题】:How to hookup Humanizer for ASP.NET Core Razor Pages?如何为 ASP.NET Core Razor 页面连接 Humanizer?
【发布时间】:2021-01-01 10:03:11
【问题描述】:

我是 ASP.NET Core Razor Pages 的新手,我正在尝试使用 IDisplayMetadataProviderHumanizer 框架连接到 Razor Pages 视图管道。我希望我的所有视图都将我的模型属性转换为标签上的“标题大小写”字符串。

例如,我想做这样的事情:

public class Person
{
   public string FirstName { get; set; }
   public string LastName { get; set; }
}

使用上面的类定义,我希望我的标签在我说@Html.DisplayNameFor(...) 的任何时候自动使用 Humanizer To.TitleCase

<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

解决方案(更新)

我能够使用 Humanizer 自述文件页面底部的教程 (explained here) 在经典的 ASP.NET MVC 中进行配置。在网上浏览了一段时间后,我确实找到了 Michael Whelan 的this post

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()));

希望这对某人有所帮助!

【问题讨论】:

    标签: asp.net-core razor-pages humanizer


    【解决方案1】:

    找到了

    这是一个PEBCAK 问题。 ?‍♂️

    修复在这里:

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

    一旦 if 语句被修复,“第一次尝试”就按预期工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-22
      • 2021-05-13
      • 2020-08-22
      • 2021-11-12
      • 2021-10-27
      • 2019-05-22
      • 2018-10-21
      • 2021-07-06
      相关资源
      最近更新 更多