c# - ModelMetadata.Container 属性为 null

标签 c# asp.net asp.net-mvc modelmetadata modelmetadataprovider

我正在编写一个自定义的ModelMetadataProvider,它扩展了默认的DataAnnotationsModelMetadataProvider。不幸的是我遇到了一个问题: ModelMetadata.Container 属性始终为 null。根据ModelMetadata Class的msdn描述,当model表示属性时,容器属性不应该为null:

enter image description here

但是当重写 GetMetadataForProperty 方法时,在调用基本实现 Container 属性后始终返回 null:

enter image description here

protected override ModelMetadata GetMetadataForProperty(
            Func<object> modelAccessor, 
            Type containerType, 
            PropertyDescriptor propertyDescriptor)
        {
            ModelMetadata metadata = base.GetMetadataForProperty(modelAccessor, containerType, propertyDescriptor); 

            // metadata.Container always null here                
        }

另一方面,当从 ViewData 访问 ModelMetadata 时,Container 属性将按预期填充:

enter image description here

因此我有几个与此问题相关的问题:

  1. ModelMetadata.Container 从 GetMetadataForProperty 返回空是预期行为还是一个错误?

  2. 有没有办法在 ModelMetadataProvider 中填充 ModelMetadata.Container 属性?

  3. ModelMetadata.Container 属性何时真正获取其内容?

最佳答案

元数据是从最里面的属性创建的,因此在调用 GetMetadataForProperty 时容器模型的元数据尚未创建(这同样适用于当您调用 OnMetadataCreated 时实现IMetadatAware)。您可以从 ViewData 访问它的原因是创建所有元数据的过程已经完成。

关于c# - ModelMetadata.Container 属性为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27998083/

相关文章:

c# - 下载 mp3 并另存为铃声

c# - 使用 session 邀请 C# 在正文中发送 Html

asp.net-mvc - 如何在 ASP MVC 中编码完整的 URL 字符串

c# - 如何在C#中从MVC Controller 返回Json数据

asp.net - Acunetix 网络扫描

asp.net-mvc - 使用 MVC 和 ASP.Net Core 重写动态 url

c# - 如何修改 IEnumerable 集合中的项目并保留其顺序

c# - LINQ to SQL 有选择地从组中选择字段

c# - 所有任务完成后我的用户界面就会更新

asp.net - VB.NET 跟踪变量