在ASP.NET MVC中,将用于复杂数据验证的数据管理规则放在何处?

在ASP.NET MVC中,将用于复杂数据验证的数据管理规则放在何处?,asp.net,asp.net-mvc,validation,data-management,Asp.net,Asp.net Mvc,Validation,Data Management,我目前正在从事一个ASP.NET MVC2项目。这是我第一次开发真正的MVC web应用程序。这确实帮助我快速入门,但我仍然有一些关于数据模型验证的模糊知识 我的问题是,当涉及到复杂的验证规则时,我真的不知道在哪里管理填充的数据模型。例如,用正则表达式验证字符串字段非常容易,我知道我只需要用一个特定的属性修饰我的字段,所以数据管理规则在模型中实现。但是,如果我有多个字段需要相互验证,例如需要按照特定时间规则正确设置的多个datetime,我需要在哪里验证它们?我知道我可以创建自己的验证属性,但有

我目前正在从事一个ASP.NET MVC2项目。这是我第一次开发真正的MVC web应用程序。这确实帮助我快速入门,但我仍然有一些关于数据模型验证的模糊知识

我的问题是,当涉及到复杂的验证规则时,我真的不知道在哪里管理填充的数据模型。例如,用正则表达式验证字符串字段非常容易,我知道我只需要用一个特定的属性修饰我的字段,所以数据管理规则在模型中实现。但是,如果我有多个字段需要相互验证,例如需要按照特定时间规则正确设置的多个datetime,我需要在哪里验证它们?我知道我可以创建自己的验证属性,但有时验证会要求特定的验证路径,该路径非常复杂,需要使用属性进行验证

第一个问题也让我想到了一个相关的问题,即在控制器中验证模型是否正确?因为目前这是我找到的唯一复杂验证方法。但我发现这有点脏,我觉得它并不真正适合控制器角色,而且更难测试(多代码路径)

谢谢


注意:我在这里找到了一些非常好的解决方案,但我正在等待其他想法和一些“最佳实践”解决方案。

我个人的意见是尽可能保持视图干净,并尝试强制视图仅显示数据(尽可能保持视图愚蠢)

当然,您可以在视图中执行一些简单的验证,例如Required、Regex规则等

复杂的业务规则应该位于业务实体或某些业务逻辑层中


我在MVC项目中所做的是让模型调用一个方法,比如Validate(),它将检查验证的最终级别,比如业务规则等等,然后我可以调用Save()

一旦有一个已填充的类准备好进行验证,只需将其传递给控制器中的验证类。

Mega Dupe.Mega Subjective.使用MVC验证的位置和方式“这场争论被打得死去活来,却没有给出一个直截了当的答案。这对每个开发者/商店来说都是如此主观和哲学,以至于几乎不可能每个人都同意任何事情

另一个问题是,验证工具甚至有很多形状和大小,可以在不同的范围和层中运行。验证工具的多样性近乎疯狂。如果(someString!=“”)变得这么难,那是怎么回事

如果你阅读这些其他答案,你会很快发现根本没有最佳实践。一旦你进入领域驱动的设计原则和关于无效状态和对象的讨论,你会发现讨论变得更加复杂

DDD:


我也在问自己同样的问题。尽量做到“干巴巴的”,我应该如何处理简单的验证(必需的、格式等)?我是否应该使用DataAnnotation在视图中强制执行它,并在业务层中重做相同的验证(以及更复杂的验证)?我非常喜欢这个想法。它记得我在默认帐户控制器中使用的设计。我相信我可以很容易地扩展我的部分LinqToSql模型部分类。谢谢。@r0经理,我经常听到这样的话;我听起来总是很生气?我真的不是(我只是开玩笑,不要太过个人化。感谢所有这些链接。所以我打赌这一切都是为了练习。作为一名初学者,我习惯于在开始使用新技术时搜索最佳实践。