当前位置: 首页 > 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.hskmm.com/?act=detail&tid=27217

相关文章:

  • 2025 年清理工具应用程序品牌最新推荐榜单:精选适配 macOS 系统的优质系统优化工具,助力高效管理 icloud 与谷歌云储存空间苹果系统清理/云储存清理工具公司推荐
  • Claude Sonnet 4.5 发布,程序员原地起飞!!
  • 2025 年上海商用净水器公司实力最新推荐权威排行榜:深度剖析学校 / 医院 / 写字楼 / 工厂 / 事业单位优质之选
  • cursor 开了 pro 没办法使用 claude 模型
  • 从0开始使用LabVIEW操作数据采集卡-概述和新建新建项目
  • 当开发者学会拒绝
  • 日志不是垃圾:它是系统的生命线
  • 堆空间的GC和元空间的GC
  • 2025 涿州装修公司最新推荐权威榜:高性价比品牌精选及靠谱选择指南
  • builder.Services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All))了解
  • 从写代码到造系统:一个开发者的自我进化
  • 排查服务器磁盘IO瓶颈脚本 - 实践
  • 2025 年板材源头厂家最新推荐排行榜:聚焦 ENF 级环保、零醛添加等优质板材,精选实力企业助您精准选购零醛添加/装修/生态板/指接板/直拼板板材PET实木板材厂家推荐
  • 数据采集传输卡:430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡
  • 微软官方卸载Office工具下载-微软官方的office卸载工具
  • 高清视频显微镜厂家推荐榜:偏光、测量、工业显微镜多场景应用分析
  • 2025大中型企业CRM选型指南:从核心功能到解决方案全解析 - SaaS软件
  • Motion Bro 必备AE/PR特效预设脚本全新汉化版本支持Win/Mac安装教程
  • 世界的物质性及发展规律
  • word快速调整某列宽度
  • word设置表格内容自动调整
  • 深入解析:携手订单日记,溯元粒开启智能升级之路
  • Ubuntu24.04 部分软件开启 Fractional Scaling
  • 2025 年最新酶解海藻源头厂家权威推荐榜单:全方位剖析实力厂商,助力选购优质酶解海藻产品酶解海藻液/酶解海藻肥/纯酶解海藻/高浓度酶解海藻厂家推荐
  • 图表全能王新增支持散点图功能,数据分析更强大!
  • 图表全能王新增支持K线图,数据分析更强大!
  • 图表全能王 (ChartStudio) 新增径向树图 (Radial Tree Diagram):创新层级数据可视化
  • 图表全能王 (ChartStudio) 新增箱线图:轻松展示数据分布
  • VS2022 过期
  • 主页地址