我正在编写自定义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
访问它的原因是创建所有元数据的过程已经完成。