确保服务器端和客户端之间的验证逻辑同步

问题描述:

在我的previous question大多数评论者都认为,在客户端&服务器端验证逻辑是件好事。确保服务器端和客户端之间的验证逻辑同步

但是有一个问题 - 您需要保持数据库和客户端代码之间的验证规则同步。

所以问题是我们该如何处理呢?

一种方法是使用ORM技术,现代的ORM工具可以生成代码,在将数据发送到服务器之前可以处理数据验证。

我有兴趣听取您的意见。
您是否有某种标准流程来处理这个问题?或者,也许你认为这根本不是问题? :)

编辑

伙计们,首先感谢您的答案。

明天我会总结一下你的答案和更新问题的文字像this case

正如在回答其他职位的人提到,如果你要保持你的分层,有没有好办法避免重复每个图层中的验证逻辑。如果你使用某些东西来自动将它们绑定在一起,你已经在层之间引入了一种可能阻碍你行进的耦合。这可能是您需要手动跟踪事件的情况之一。

但是你要做的是,你必须确保每个图层都在进行自己的验证,因为你永远不知道该图层将如何被访问。无法保证您实施的所有图层始终保持在一起。

我喜欢使用验证服务,它不一定关心要验证的数据的来源。当您了解将验证规则传输到客户端(即网页)的部分时,这可以以几种不同的方式工作,但我认为最重要的方面是对实际验证规则拥有单一权限。例如,如果您在数据核心实体上具有验证逻辑,例如通过Validate方法(一种非常典型的场景)检查的ValidationRule对象集合,那么我会将这些相同的规则提升到客户端(javascript)通过转型。

在ASP.NET世界(我可以说的唯一一个)中,有几种方法可以做到这一点。我的首选方法涉及创建自定义验证器,将您的UI小部件绑定到实体上的字段(及其所有验证规则)。这样做的好处是所有的验证逻辑都可以绑定到一个验证器中。不利的一面是您的验证信息将变得密集,因为验证规则都是一次全部测试的。当然,这可以通过让你的验证逻辑只返回第一个失败的提及来缓解,等等。

这个答案可能听起来有点含糊不清,但我想要做的两点是:

  1. 验证应尽可能接近输入数据和提交数据的位置。无论发生验证
  2. 相同的验证规则,应使用 - 如果客户端验证通过,那么它应该永远以后验证失败(预存业务规则,外键冲突等)

一些框架提供验证支持,可以保持您的客户端和服务器验证同步。看看这个Seam validation tutorial使用注释。这是一个很好的实现,很容易理解。

无论如何,如果你不想依赖框架,我认为很容易实现类似的东西。

如果您使用ASP.Net,您可以使用多种验证控件。这些控件是以一种非常通用的方式编写的,因此它们中的大多数会自动在客户端和服务器之间复制验证逻辑,即使您只在一个位置为控件设置了选项。

您也可以从中继承来创建其他特定于域的验证器,并且网上还有第三方控件包,您可以将它们添加到基本控件中。

即使你不使用ASP.Net,也值得看看这是如何完成的。它会给你如何在自己的平台上做类似的想法。