2015-01-17 64 views
1

我正在编写自定义ModelMetadataProvider,它扩展了默认的DataAnnotationsModelMetadataProvider。不幸的是我遇到了一个问题: ModelMetadata.Container属性始终为空ModelMetadata.Container属性为空

enter image description here

但覆盖GetMetadataForProperty方法时,调用基实现集装箱属性总是返回为空后:

enter image description hereModelMetadata Class MSDN描述,当模型是一个属性的容器属性不应为空

protected override ModelMetadata GetMetadataForProperty(
      Func<object> modelAccessor, 
      Type containerType, 
      PropertyDescriptor propertyDescriptor) 
     { 
      ModelMetadata metadata = base.GetMetadataForProperty(modelAccessor, containerType, propertyDescriptor); 

      // metadata.Container always null here     
     } 

在其他的方式,访问来自ViewDataModelMetadata时,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在这方面的任何决议?参考容器类型会非常有帮助 –