ASP .NET Core IDisplayMetadataProvider

发布: (2025年12月22日 GMT+8 06:24)
3 min read
原文: Dev.to

Source: Dev.to

请提供您想要翻译的具体文本内容,我将按照要求保留链接、格式和代码块,仅翻译正文部分。谢谢!

介绍

学习如何使用实现 IDisplayMetadataProvider 的类,将属性名如 FirstName 转换为 First Name

HTML 表格示例

Example for an HTML table

标准编辑页面示例

Example for a standard edit page

使用提供的类 不是 Display 属性的替代品;它是一种可选方案。

使用 Display 属性的示例类

public partial class Person
{
    public int PersonId { get; set; }

    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Display(Name = "Last Name")]
    public string LastName { get; set; }

    [Display(Name = "Email Address")]
    public string EmailAddress { get; set; }
}

使用自定义提供程序的示例类

public partial class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}

使用 PascalCaseDisplayMetadataProvider

Program.cs 中的设置

builder.Services.AddControllersWithViews(options =>
{
    options.ModelMetadataDetailsProviders.Add(
        new PascalCaseDisplayMetadataProvider(
            [typeof(Person)],
            includeDerivedTypes: false));
});
  • Parameter 1:一个目标类型的集合,其显示元数据应进行自定义。
  • Parameter 2:一个布尔值,指示是否也应处理指定类型的派生类型。

替代设置 – 动态加载文件夹中的所有类

从程序集检索类名的辅助方法

static string[] GetClassNamesFromAssembly(Assembly assembly, string? @namespace = null) =>
    assembly
        .GetTypes()
        .Where(t => t is { IsClass: true, IsAbstract: false })
        .Where(t => @namespace == null || t.Namespace == @namespace)
        .Select(t => t.Name)
        .Distinct()
        .OrderBy(n => n)
        .ToArray();

Main 方法中进行配置

string ns = typeof(Program).Namespace!;

string[] classNames = GetClassNamesFromAssembly(
    typeof(Program).Assembly,
    $"{ns}.Models");

// Configures a custom display metadata provider to format PascalCase property names
// into a more readable format.
builder.Services.AddControllersWithViews(options =>
{
    options.ModelMetadataDetailsProviders.Add(
        new PascalCaseDisplayMetadataProvider(
            [.. classNames
                .Select(name => Type.GetType($"{ns}.Models.{name}"))
                .Where(type => type is not null)
                .Cast()],
            includeDerivedTypes: false));
});

💡 与其将 PascalCaseDisplayMetadataProvider 复制到每个项目中,不如引用包含该类的 AspCoreHelperLibrary 包。

源代码

该示例项目演示了 PascalCaseDisplayMetadataProvider 与 FluentValidation 以及基于 CSS 的必填字段指示器的结合使用。

GitHub 上的源代码

更多内容即将发布

关于此主题的更多文章将很快发布。

Back to Blog

相关文章

阅读更多 »