1

Я пишу обычай ModelMetadataProvider, который распространяется по умолчанию DataAnnotationsModelMetadataProvider. К сожалению, я столкнулся с проблемой: ModelMetadata.Container Недвижимость всегда null. Согласно описанию MSDN из ModelMetadata Class, контейнера свойство не должно быть пустым, когда модель представляет собой свойство:ModelMetadata.Container свойство null

enter image description here

Но когда переопределение GetMetadataForProperty метод, после вызова базы реализации контейнера свойства всегда возвращает в нуле:

enter image description here

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

enter image description here

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

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

  2. Есть ли способ получить ModelMetadata.Container недвижимость, заполненная внутри ModelMetadataProvider?

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

ответ

2

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

+0

Прежде всего, спасибо за ответ, но я заметил следующее поведение, которое немного противоречит ему: каждый раз, когда я нажимаю Html.EditorFor, я вижу, что он вызывает GetMetadataForProperty. ViewData.ModelMetadta.Container доступен до этого вызова, так как он недоступен внутри GetMetadataForProperty, который вызывается после? –

+1

Интересно. Некоторое время назад я пытался решить ту же проблему, что и у вас, и создал модель, содержащую тип значения и сложный объект, который, в свою очередь, содержал тип значения и сложные объекты (3 уровня в глубину) и отлаживал его, что показало, что метаданные создавались из внутренних свойств. Время для еще нескольких тестов :) –

+0

@StephenMuecke любое разрешение на это? Обращение к типу контейнера было бы весьма полезно –

Смежные вопросы