【发布时间】:2018-04-28 01:16:15
【问题描述】:
这是一个棘手的问题,需要深入了解 ASP.NET Core 框架。我将首先解释在 MVC 3 实现中我们的应用程序发生了什么。
有一个复杂的需求需要解决,涉及到特定视图上的 ViewModel 的 ModelMetaData。这是一个高度可配置的应用程序。因此,对于一种“期刊类型”,属性可能是强制性的,而对于另一种,完全相同的属性可能是非强制性的。此外,它可以是一个“期刊类型”的单选按钮和另一个的选择列表。由于所有这些配置选项有大量的组合、混合和匹配,因此为每个可能的排列创建单独的 ViewModel 类型是不切实际的。因此,有一个 ViewModel 类型,并且 ModelMetaData 是在该类型的属性上动态设置的。
这是通过创建自定义ModelMetadataProvider(通过继承DataAnnotationsModelMetadataProvider)来完成的。
Smash-cut 到现在,我们正在升级应用程序并在 ASP.NET Core 中编写服务器内容。我已经确定实现IDisplayMetadataProvider 是在 ASP.NET Core 中修改模型元数据的等效方法。
问题是,框架内置了缓存,任何实现IDisplayMetadataProvider 的类只运行一次。我在调试 ASP.NET Core 框架时发现了这一点,this comment 证实了我的发现。这样的缓存将不再满足我们的要求,因为第一次访问 ViewModel 类型时,MetadataDetailsProvider 将运行并缓存结果。但是,如上所述,由于高度动态的配置,我需要它在每个ModelBinding 之前运行。否则,我们将无法利用ModelState。第一次命中该端点时,元数据会为所有未来的请求设置好。
而且我们有点需要利用使用反射遍历所有属性的递归过程来设置元数据,因为我们不想自己这样做(超出我的薪酬规模的巨大努力)。
所以,如果有人认为我错过了新核心框架中的某些内容,请务必告诉我。即使删除 ModelBinders 和 IDisplayMetadataProviders 的缓存功能很简单(这就是我将在接下来的几天内通过 ASP.NET 源代码研究的内容)。
【问题讨论】:
标签: asp.net asp.net-core asp.net-core-2.0