2

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

在此处输入图像描述

但是在覆盖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                
        }

另一方面,当从 访问ModelMetadataViewDataContainer属性按预期填充:

在此处输入图像描述

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

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

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

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

4

1 回答 1

3

元数据是从最里面的属性创建出来的,所以容器模型的元数据在被调用的时候还没有被创建(在你实现的时候GetMetadataForProperty同样适用)。您可以访问它的原因是创建所有元数据的过程已经完成。OnMetadataCreatedIMetadatAwareViewData

于 2015-01-17T09:52:44.197 回答