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



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



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

            // metadata.Container always null here
        }


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



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


是ModelMetadata.Container从GetMetadataForProperty返回空值的预期行为,还是错误?
有没有办法在ModelMetadataProvider内部填充ModelMetadata.Container属性?
当ModelMetadata.Container属性实际获取它的内容时?

最佳答案

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

10-04 14:19