Свойство ModelMetadata.Container имеет значение null
Я пишу обычай ModelMetadataProvider
который продлевает дефолт DataAnnotationsModelMetadataProvider
, К сожалению, я столкнулся с проблемой:ModelMetadata.Container
свойство всегда равно нулю Согласно описанию MSDN ModelMetadata Class
свойство контейнера не должно быть нулевым, когда модель представляет свойство:
Но при переопределении GetMetadataForProperty
Метод, после вызова базовой реализации, свойство контейнера всегда возвращает значение 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
или это баг?Есть ли способ получить
ModelMetadata.Container
свойство заполнено внутри ModelMetadataProvider?Когда свойство ModelMetadata.Container фактически получает его содержимое?
1 ответ
Метаданные создаются из самых внутренних свойств, поэтому метаданные модели контейнера еще не были созданы в то время. GetMetadataForProperty
называется (то же самое относится к OnMetadataCreated
когда вы реализуете IMetadatAware
). Причина, по которой вы можете ViewData
является то, что процесс создания всех метаданных был завершен.