ASP .NET Core IDisplayMetadataProvider

发布: (2025年12月22日 GMT+8 06:24)
3 分钟阅读
原文: 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

相关文章

阅读更多 »

C# Minimal API:输出缓存

Minimal API:输出缓存 将生成的响应存储在服务器上,并直接提供,而无需重新执行端点。Microsoft Docs https://learn.m...

SOLID 再探 — 后模式视角

为什么原则不如背后的力量重要:SOLID 不是一份检查清单,而是对更深层力量的历史压缩。这是系列的第 5 部分。