Свойство 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 свойство заполняется как ожидалось:

Таким образом, у меня есть пара вопросов, связанных с этой проблемой:

  1. Это ожидаемое поведение, которое ModelMetadata.Container возвращает пустым из GetMetadataForProperty или это баг?

  2. Есть ли способ получить ModelMetadata.Container свойство заполнено внутри ModelMetadataProvider?

  3. Когда свойство ModelMetadata.Container фактически получает его содержимое?

1 ответ

Метаданные создаются из самых внутренних свойств, поэтому метаданные модели контейнера еще не были созданы в то время. GetMetadataForProperty называется (то же самое относится к OnMetadataCreated когда вы реализуете IMetadatAware). Причина, по которой вы можете ViewData является то, что процесс создания всех метаданных был завершен.

Другие вопросы по тегам