当前位置: 首页 > news >正文

元数据提供器(IMetadataDetailsProvider)是什么

IMetadataDetailsProvider 并不是“一个”接口,而是所有“模型元数据提供器”的统称/标记接口。
它本身空无一物,真正的职责由下面三个“子接口”分担:
  • IBindingMetadataProvider → 决定“能不能绑、谁来绑”
  • IDisplayMetadataProvider → 决定“显示名、模板、顺序”
  • IValidationMetadataProvider → 决定“要验证什么、用什么规则”
框架在第一次遇到某个类型或属性时,会依次调用这些接口的实现,把收集到的“细节”写进同一个 ModelMetadata 对象,然后缓存起来供整个 ASP.NET Core 管道使用。

  1. 定义——空接口,只是“标记”


public interface IMetadataDetailsProvider { }
 
文档原话:
“有关模型对象的元数据详细信息提供程序的标记接口。实现应实现 IBindingMetadataProviderIDisplayMetadataProviderIValidationMetadataProvider 中的一个或多个。”
 

  1. 工作位置——在 ModelMetadata 被创建时

  1. 启动阶段:
    DefaultModelMetadataProvider 反射拿到类型/属性 → 新建 MetadataDetails 对象。
  2. 运行阶段:
    MvcOptions.ModelMetadataDetailsProviders 集合里所有实现了上述子接口的实例跑一遍,让它们往 Details 里写数据。
  3. 合成阶段:
    用写满的 Details 构造出最终的 ModelMetadata 并全局缓存。

  1. 常见“真身”——你写的其实就是这三个

表格
子接口典型用途关键方法
IBindingMetadataProvider 禁用绑定、指定自定义绑定器 void CreateBindingMetadata(BindingMetadataProviderContext)
IDisplayMetadataProvider 改 DisplayName、模板、顺序 void CreateDisplayMetadata(DisplayMetadataProviderContext)
IValidationMetadataProvider 动态加验证特性 void CreateValidationMetadata(ValidationMetadataProviderContext)
一个类可以同时实现多个接口,一次性把绑定+显示+验证的规则全部注入。

  1. 代码例子——让所有 string 属性自动拥有 [StringLength(100)]

 
public class StringLength100Provider : IValidationMetadataProvider
{public void CreateValidationMetadata(ValidationMetadataProviderContext ctx){if (ctx.Key.ModelType == typeof(string) &&!ctx.ValidationMetadata.ValidatorMetadata.OfType<StringLengthAttribute>().Any()){ctx.ValidationMetadata.ValidatorMetadata.Add(new StringLengthAttribute(100));}}
}// 全局注册
builder.Services.AddMvc(o =>o.ModelMetadataDetailsProviders.Add(new StringLength100Provider()));
 
注册后,任何实体类的 string 属性都会凭空多一条 StringLength(100) 验证,无需在实体上硬编码特性。

  1. 一句话总结

IMetadataDetailsProvider 就是 ASP.NET Core 模型绑定/验证/显示管线里的“插件总线”——
你自己实现它的三个子接口中的任意组合,再扔进 MvcOptions.ModelMetadataDetailsProviders
就能在不改动实体类的前提下,全局、动态、按需地注入绑定规则、显示文案或验证逻辑。
http://www.jsqmd.com/news/10469/

相关文章:

  • 2025 年清理工具应用程序品牌最新推荐榜单:精选适配 macOS 系统的优质系统优化工具,助力高效管理 icloud 与谷歌云储存空间苹果系统清理/云储存清理工具公司推荐
  • 从0开始使用LabVIEW操作数据采集卡-概述和新建新建项目
  • 当开发者学会拒绝
  • 日志不是垃圾:它是系统的生命线
  • 堆空间的GC和元空间的GC
  • 2025 年板材源头厂家最新推荐排行榜:聚焦 ENF 级环保、零醛添加等优质板材,精选实力企业助您精准选购零醛添加/装修/生态板/指接板/直拼板板材PET实木板材厂家推荐
  • 世界的物质性及发展规律
  • word快速调整某列宽度
  • word设置表格内容自动调整
  • 深入解析:携手订单日记,溯元粒开启智能升级之路
  • 基于MTPA的永磁同步电机FOC仿真
  • 2025 年最新壳寡糖厂家权威推荐排行榜:聚焦水溶性、高纯度、酶解型产品,为农化企业等下游客户精准筛选优质合作方多级别/农业级/多功能壳寡糖/壳寡糖水溶肥公司推荐
  • Ubuntu24.04 部分软件开启 Fractional Scaling
  • 2025 年最新酶解海藻源头厂家权威推荐榜单:全方位剖析实力厂商,助力选购优质酶解海藻产品酶解海藻液/酶解海藻肥/纯酶解海藻/高浓度酶解海藻厂家推荐
  • 图表全能王新增支持散点图功能,数据分析更强大!
  • 图表全能王新增支持K线图,数据分析更强大!
  • 图表全能王 (ChartStudio) 新增径向树图 (Radial Tree Diagram):创新层级数据可视化
  • CF2145F Long Journey
  • Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)了解
  • mybatis pagehelper 分页参数污染线程的问题
  • TortoiseGit——Error:Unable to write index
  • 2025 年等离子清洗机源头厂家最新推荐排行榜:聚焦大气真空宽幅等多类型设备,精选实力口碑双优企业自动化/常压/低温/大腔体/射频等离子清洗机厂家推荐
  • Litho(deepwiki-rs):让代码自己说话——AI驱动的自动化架构文档生成革命
  • 2025 年最新推荐!国内空调机组厂家权威排行榜,含冷凝热回收等多类型机组企业优选指南冷凝热回收/泳池热泵/屋顶式/海水源养殖热泵空调机组厂家推荐
  • 基于Zernike灰度矩的亚像素边缘检测实现(精度0.05 pixel)
  • 鸿蒙应用开发从入门到实战(十七):ArkUI组件List列表布局
  • 详细介绍:CSS3美化页面元素
  • 2025 最新推荐!AI 写作工具公司榜单:综合实力、用户体验与新锐品牌深度解析
  • 2025 最新推荐:AI 写小说工具公司口碑排行榜,聚焦卓越品质与新锐实力的权威指南
  • Gitee领航本土DevOps平台发展新纪元:数字化转型中的中国方案