首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ModelMetadataProvider覆盖MetadataTypeAttribute的替代品

ModelMetadataProvider覆盖MetadataTypeAttribute的替代品
EN

Stack Overflow用户
提问于 2013-08-05 18:21:34
回答 2查看 317关注 0票数 1

在尝试使用Asp.Net MVC一段时间后,我决定在项目中实际使用它。出现的问题之一是,对于给定的模型,前端站点可能具有与管理面板不同的验证规则。

我知道MetadataType属性,但由于您有多个上下文,这不适用于我们的开箱即用。

为了解决这个问题,我实现了一个自定义的ModelMetadataProvider,它根据请求的执行上下文将默认的ModelMetdataProvider重定向到不同的类型。这可以很好地显示所需的UI。

这个解决方案中我不喜欢的部分是,我最终从我的自定义模型元数据提供程序中读取了堆栈,以确定给定的调用是否用于模型绑定。这是因为当我没有这样做时,我会在从控制器调用TryUpdateModel的过程中正确地得到“对象不匹配目标类型”,因为模型绑定器试图使用类型A的属性来设置类型B的实例的值。

读取调用堆栈对于生产来说真的是一个糟糕的主意吗?有没有一种方法可以有选择地复制MetadataTypeAttribute行为而不使用属性?

提前谢谢你,

约翰

EN

回答 2

Stack Overflow用户

发布于 2013-08-06 03:25:25

这是你希望ASP.NET MVC团队没有封存一个类的实例之一--我相信他们有他们的理由。我打算简单地创建您自己的属性,派生自MetadataTypeAttribute。

要做到这一点,一种方法是获取属性的源代码并编写自己的代码:

http://dotnetinside.com/framework/v4.0.30319/framework/v4.0.30319/System.ComponentModel.DataAnnotations/MetadataTypeAttribute

当然,这会降低代码的可维护性。

我要断言,据我所知,使用ModelMetadataProvider作为解决方案,您已经做出了正确的决定。我对分析调用堆栈、更改位置、将某些东西移动到某个区域感到有点紧张;您明白我的意思,即很容易使用构建时决策破坏代码,直到运行时或QA之后才能发现。

您还没有提供上下文是如何大致确定的,但我个人会通过向类本身添加一个带有可能上下文列表的Enum (有限可能性和设计时中断)属性来解决这个问题,然后在类的启动期间,填充它,为提供者的执行做好准备,提供者将根据Enum的值传递正确的元数据类型。

有很多方法可以剥这只猫的皮,但是在构建时会有一些东西会损坏,这对你来说是最好的,IMHO。

票数 0
EN

Stack Overflow用户

发布于 2016-03-18 18:00:07

除非你使用的是MVC6,否则你可能会发现ModelMetadata Fluent Configuration很有用。

如何使用它的一些很好的例子可以在herehere中找到。

真正重要的是,它只是代码,完全在你的控制之下。因此,一旦你有了不同的上下文,你可能会决定定义不同的配置,或者你可能会更努力一点,为不同的上下文进行(一组)不同的注册。

真正有帮助的是“装饰”(故意使用的术语!)属性,至少看起来没有什么能阻止你这样做。

编辑:模型元数据不应将WCF RIA Services Contrib混淆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18055806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档