【问题标题】:ModelMetadata.Container property is nullModelMetadata.Container 属性为空
【发布时间】:2018-02-14 12:01:39
【问题描述】:

我正在编写一个自定义的ModelMetadataProvider,它扩展了默认的DataAnnotationsModelMetadataProvider。不幸的是我遇到了一个问题: ModelMetadata.Container 属性始终为空。根据ModelMetadata Class的msdn描述,model代表属性时容器属性不能为空:

但是当覆盖GetMetadataForProperty方法时,调用base implementation Container属性后总是返回null:

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

            // metadata.Container always null here                
        }

另一方面,当从ViewData 访问ModelMetadata 时,Container 属性按预期填充:

因此,我有几个与此问题相关的问题:

  1. ModelMetadata.Container 从GetMetadataForProperty 返回空是一种预期行为还是一个错误?

  2. 有没有办法在 ModelMetadataProvider 中填充 ModelMetadata.Container 属性?

  3. ModelMetadata.Container 属性何时真正获取它的内容?

【问题讨论】:

    标签: c# asp.net asp.net-mvc modelmetadata modelmetadataprovider


    【解决方案1】:

    元数据是从最里面的属性向外创建的,因此在调用GetMetadataForProperty 时尚未创建容器模型的元数据(当您实现IMetadatAware 时,OnMetadataCreated 也是如此)。可以通过ViewData访问的原因是已经完成了所有元数据的创建过程。

    【讨论】:

    • 首先感谢您的回答,但我注意到与它略有矛盾的以下行为:每次我在视图中点击 Html.EditorFor 时,我看到它调用 GetMetadataForProperty。 ViewData.ModelMetadta.Container 在此调用之前可用,为什么它在调用后的 GetMetadataForProperty 内部不可用?
    • 有趣。前段时间我试图解决你遇到的同样问题并创建了一个包含值类型和复杂对象的模型,该模型又包含一个值类型和一个复杂对象(3 级深)并对其进行调试,这表明元数据是从内部属性创建的。是时候进行更多测试了:)
    • @StephenMuecke 对此有何解决方案?参考容器类型会很有帮助
    • @AaronHudon,我记得当时对此做了一些测试,但那是一年前的事了,我现在不记得结果是什么了。下周我会努力找时间再跟进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2018-03-11
    相关资源
    最近更新 更多