ASP .NET Core IDisplayMetadataProvider
发布: (2025年12月22日 GMT+8 06:24)
3 min read
原文: Dev.to
Source: Dev.to
请提供您想要翻译的具体文本内容,我将按照要求保留链接、格式和代码块,仅翻译正文部分。谢谢!
介绍
学习如何使用实现 IDisplayMetadataProvider 的类,将属性名如 FirstName 转换为 First Name。
HTML 表格示例
标准编辑页面示例
使用提供的类 不是 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 的必填字段指示器的结合使用。
更多内容即将发布
关于此主题的更多文章将很快发布。

