Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 .net MVC3 DataAnnotation-如何防止重复验证_Asp.net Mvc 3_Data Annotations - Fatal编程技术网

Asp.net mvc 3 .net MVC3 DataAnnotation-如何防止重复验证

Asp.net mvc 3 .net MVC3 DataAnnotation-如何防止重复验证,asp.net-mvc-3,data-annotations,Asp.net Mvc 3,Data Annotations,我在使用数据注释进行验证时遇到了问题,我想知道是否有人做过类似的事情 我们将域实体放在域层中,对于每个域实体,我们都有一个MetadataType类,该类以注释的形式包含适用的业务规则。域实体类还为未使用DataAnnotations实现的任何验证实现IValidatableObject 在Web/表示层中,我们使用视图模型对象。这些可能是来自多个域实体或单个域实体的数据,现在让我们假设一个域实体。此模型视图用[MetadataType(typeof(DomainEntityMetaData))

我在使用数据注释进行验证时遇到了问题,我想知道是否有人做过类似的事情

我们将域实体放在域层中,对于每个域实体,我们都有一个MetadataType类,该类以注释的形式包含适用的业务规则。域实体类还为未使用DataAnnotations实现的任何验证实现IValidatableObject

在Web/表示层中,我们使用视图模型对象。这些可能是来自多个域实体或单个域实体的数据,现在让我们假设一个域实体。此模型视图用[MetadataType(typeof(DomainEntityMetaData))]修饰

这使我们的业务逻辑保持在域中,而不在视图模型中。但是,视图模型没有实现IValidatableObject,因此永远不会执行。我显然不想在视图中重复验证


关于如何解决这个问题的任何建议?

可以通过以下链接找到您想要的答案。(因为问题描述不太清楚)


您的部分问题在于,您试图在视图中执行域验证。虽然这在某些情况下是可行的,但它确实违反了关注点分离原则。视图和域是不同的关注点,它们都有自己的验证关注点

这是一个特别的问题,因为您的ViewModel对象与您的域模型对象不同,但您正试图利用域元数据作为视图模型的验证器。那总是会引起问题的

例如,您可能有一个向导,可以跨多个页面逐步创建域对象。如果您进行域验证,您将遇到验证问题,因为您没有在各个步骤中填写所需的数据

无论您有什么域验证,都必须定义视图验证。这可能意味着复制元数据

关注点的分离经常与DRY发生冲突(不要重复)。如果您想选择DRY而不是SOC,那么您需要将域模型合并到视图模型中,并对两者使用相同的模型

当您在应用程序中使用两个不同的原则时,它会变得混乱。您在您的域中使用SOC,并且您希望在您的视图中使用DRY。这在很多情况下都不起作用。我不知道为什么您要尝试用域元数据属性装饰视图模型。显然,视图模型与域模型不同,因此尝试使用域元数据将导致阻抗不匹配


这并不是说你不能解决你的问题。您可能可以,但这需要修改MVC的基本设计,添加您自己的扩展部件,等等。。问题是,你想做多少工作来节省一些工作?

听起来你需要一个动作过滤器。如果你能分享一些代码,那会很有帮助。我的意思是你的ViewModel和实体是如何关联的?数据是如何流动的,因此我们可以思考如何在@Mystere Man验证数据,谢谢,这是有意义的。是的,我们需要SOC,不希望在表示层中直接使用域模型(模型绑定)。我们也不想在域层和UI层(Dry)重复验证。MetaDataType类可以在域和UI中使用(共享)。不起作用的是必须在域或视图模型上实现的Ivalidatable对象。(尝试在IValidatableObject上实现,但被忽略了。)因此,下一个最接近的方法是在模型绑定后从控制器手动调用Validate方法,但这似乎有点做作。@Andre-正如我所说,您可能可以通过破解使其工作。但在我看来,视图和域应该有不同的验证代码,尤其是当视图模型与域模型不相同时。我不知道你怎么说你的元数据验证有效,因为你说你的ViewModel包含几个不同的对象组合在一起。这是没有意义的。你是对的,它只适用于一个简单的例子,其中viewmodel只有一个域模型。