Я пишу обычай ModelMetadataProvider
, который распространяется по умолчанию DataAnnotationsModelMetadataProvider
. К сожалению, я столкнулся с проблемой: ModelMetadata.Container
Недвижимость всегда null. Согласно описанию MSDN из ModelMetadata Class
, контейнера свойство не должно быть пустым, когда модель представляет собой свойство:ModelMetadata.Container свойство null
Но когда переопределение GetMetadataForProperty
метод, после вызова базы реализации контейнера свойства всегда возвращает в нуле:
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 фактически получает контент?
Прежде всего, спасибо за ответ, но я заметил следующее поведение, которое немного противоречит ему: каждый раз, когда я нажимаю Html.EditorFor, я вижу, что он вызывает GetMetadataForProperty. ViewData.ModelMetadta.Container доступен до этого вызова, так как он недоступен внутри GetMetadataForProperty, который вызывается после? –
Интересно. Некоторое время назад я пытался решить ту же проблему, что и у вас, и создал модель, содержащую тип значения и сложный объект, который, в свою очередь, содержал тип значения и сложные объекты (3 уровня в глубину) и отлаживал его, что показало, что метаданные создавались из внутренних свойств. Время для еще нескольких тестов :) –
@StephenMuecke любое разрешение на это? Обращение к типу контейнера было бы весьма полезно –