我正在为 ASP.NET MVC 3 开发一个小型库,该库应该提供更好的模型元数据可重用性以及从数据实体到自定义视图模型的轻松映射。为此,我需要能够为 ASP.NET MVC 的三个不同领域提供我自己的 ICustomTypeDescriptor 实现:
- 脚手架
- 验证
- 模型绑定
这似乎可以通过设置 System.Web.Mvc.ModelMetadataProviders.Current
为我自己的 CustomMetaDataProvider 来完成,但这还不足以涵盖上述所有三点。
问题是 System.Web.Mvc 中有几个类直接调用到 thisSystem.Web.TypeDescriptorHelper
中,这是不可扩展的,因为它看起来像这样:
internal static class TypeDescriptorHelper {
public static ICustomTypeDescriptor Get(Type type) {
return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type);
}
}
我发现的唯一解决方案非常笨拙,需要从 System.Web.Mvc 子类化许多类型才能使其工作。我什至不得不完全重新实现CustomModelBinderDictionary
,只覆盖一两行代码。所以它可以工作,但它是一个非常混乱的 hack,并且可能会在我下次更新到新的 ASP.NET MVC 版本时中断。
所以这就是我想知道的:我错过了任何简单的方法吗?
额外的问题:如果不是并且您来自 MVC 团队,您是否可以考虑在 MVC 4 中创建一个适当的可扩展点;-)?
编辑:回答为什么我需要编写自己的 TypeDescriptor 的问题:这有几个原因: 1. 最重要的是:我需要解决https://forums.asp.net/t/1614439中描述的问题的方法.aspx/1 2. 另外,由于各种原因,我需要动态插入元数据。例如,我想编写自己的 Bind 属性,但 BindAttribute 是密封的。因此,当检测到我自己的绑定属性实现时,我不是从它派生,而是从 TypeDescriptor 动态发出匹配的 BindAttribute。