我正在为ASP.NET MVC 3开发一个小型库,它应该提供更好的模型元数据可重用性,以及从数据实体到自定义视图模型的简单映射。为此,我需要能够为ICustomTypeDescriptor MVC中感兴趣的三个不同领域提供自己的ASP.NET实现:
这似乎可以通过将System.Web.Mvc.ModelMetadataProviders.Current设置为我自己的CustomMetaDataProvider来完成,但这还远远不足以涵盖上述三点。
问题是,System.Web.Mvc中有几个类直接调用这个System.Web.TypeDescriptorHelper,这是不可扩展的,因为它如下所示:
internal static class TypeDescriptorHelper {
public static ICustomTypeDescriptor Get(Type type) {
return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type);
}
} 我发现的唯一解决方案是非常尴尬的,需要从System.Web.Mvc中对许多类型进行子类化才能使其工作。我甚至不得不完全重新实现CustomModelBinderDictionary,只需要覆盖一两行代码。因此,它可以工作,但这是一个非常混乱的黑客,很可能会打破下次我更新到一个新的ASP.NET MVC版本。
,所以我想知道的是,:我错过了任何简单的方法来做到这一点吗?
额外的问题:如果您不是MVC团队的成员,那么可以考虑在MVC 4中创建一个合适的扩展点吗?
编辑:回答了为什么我需要对自己的TypeDescriptor进行编码的问题:这有几个原因: 1.最重要的是:对于https://forums.asp.net/t/1614439.aspx/1 2中描述的问题,我需要一个解决办法。此外,由于各种原因,我需要动态地插入元数据。例如,我想编码我自己的Bind属性,但是BindAttribute是密封的。因此,在检测我自己的bind属性实现时,我不是从它派生出来,而是从BindAttribute动态地从TypeDescriptor发出匹配的bind。
发布于 2011-04-29 08:49:07
根据布拉德·威尔逊 (一位ASP.NET MVC团队成员)的说法,这个问题已经被列入了MVC 4的bug列表中。因此,目前似乎还没有很好的解决方案,但是当MVC 4出现时,这一问题有望得到解决。
对于任何对我的库有兴趣的可重用验证和脚手架元数据以及模型/视图模型映射的人,请随时订阅我在https://devermind.wordpress.com/的博客。我要把图书馆放出去。
发布于 2011-04-26 19:22:45
我不知道您想要用自定义的验证实现( ModelBinding和潜在的ModelMetadata )做什么,而这不能用MVC中的DependencyResolver功能来完成?
最近的Tooling 3中的新脚手架支持可能满足您对脚手架的需求;不过,我想看看是否可以连接到ModelBinding、ModelMetadata和验证的ModelBinding功能中,看看它们是否能够实现您正在寻找的功能。最近我也遇到了类似的情况,我需要从头到尾实现很多这样的行为,以提供一个灵活的框架,而且我能够使用ModelMetadata和使用IoC的验证提供者来实现这些行为。在少数情况下,我还继承了DynamicObject (或ExpandoObject),以提供更大的灵活性。我知道这并不是一个直接的答案,但我不知道为什么您需要访问低于这些可扩展点的任何内容?
编辑:--如果您希望在类似的ViewModels上重用ModelMetadata,以避免在多个地方重新定义相同的ModelMetadata,您可能需要考虑其中的含义。很多时候,您希望对实体进行某些数据限制,但是这些限制应该在DataModel上而不是在ViewModel上。用户可能有一个稍微更严格的规则。例如,您可以规定某些字段是ViewModel中的用户只读的,但是用作DataModel的实体允许您修改值(通常是在代码中)。类似地,您可能会遇到这样的情况:用于为ModelMetadata生成创建视图的VideModel可能与用于编辑视图的ViewModel略有不同。重用它们似乎是保持一致性和减少代码重复的一个很好的方法,但这可能是您以后后悔的事情。最近我遇到了同样的问题,为了避免为可能导致回发的每个视图编写一个新的ViewModel,我还没有找到我喜欢的完美解决方案,但我认为重用ModelMetadata会带来更多的问题,在我看来可能会解决这些问题。为需要它们的视图编写ViewModels也可能消除您实现自定义BindAttribute实现和脚手架问题的需要。如果我认为不想用自己的元数据创建这么多ViewModels是导致您尝试查找自定义BindAttribute、自定义脚手架、自定义ModelMetadata、自定义验证和自定义ModelBinding的实现的原因.也许值得看一看仅仅创建ViewModels所需的实际时间。
如果你找到更好的方法,请告诉我:-)
https://stackoverflow.com/questions/5727161
复制相似问题