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

9
在我的之前的问题中,大多数评论者都认为在客户端和服务器端都进行验证逻辑是一件好事。
然而,存在一个问题 - 您需要在数据库和客户端代码之间保持验证规则同步。
那么问题来了,我们该如何处理呢?
一种方法是使用ORM技术,现代ORM工具可以生成代码,在将数据发送到服务器之前进行数据验证。
我很想听听您的意见。
您是否有某种标准流程来解决这个问题?或者您认为这根本不是问题吗?
编辑 各位,首先感谢您们的回答。
明天我会总结您们的答案并更新问题的文本,就像这个例子一样。
4个回答

4
如在其他帖子的回答中提到的那样,如果您要保持层之间的分离,则没有好的方法可以避免在每个层中重复验证逻辑。如果使用某些东西自动将它们绑在一起,则引入了一种耦合层之间关系的方式,这可能会妨碍您未来的发展。这可能是您必须手动跟踪事物的情况之一。
无论如何,您都必须确保每个层都进行自己的验证,因为您永远不知道该层将如何被访问。不能保证您实现的所有层始终保持在一起。

2
我喜欢使用验证服务,它并不一定关心要验证的数据的来源。在将验证规则传输到客户端(即网页)时,这可以通过几种不同的方式实现,但我认为最重要的方面是确保实际验证规则的单一权威性。
例如,如果您在数据核心实体上有验证逻辑,比如通过Validate方法检查的ValidationRule对象集合 - 这是一个非常典型的场景,那么我会通过转换将这些相同的规则推广到客户端(javascript)。
在ASP.NET世界中(我只能说这个),有几种方法可以做到这一点。我喜欢的方法涉及创建自定义验证器,将其绑定到UI小部件以及实体上的字段(和所有验证规则)。其优点在于所有验证逻辑都可以捆绑到单个验证器中。缺点是验证消息会变得密集,因为所有验证规则都会同时测试。当然,这可以通过使您的验证逻辑仅返回第一个失败的提及等来缓解。
这个答案可能听起来有点模糊和不具体,但我想要表达的两个观点是:
1.验证应尽可能靠近输入数据和提交数据的位置进行。
2.无论在哪里进行验证,都应使用相同的验证规则-如果客户端验证通过,则它永远不会在以后的验证中失败(预保存业务规则,外键违规等)。

2

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

无论如何,如果您不想依赖框架,我认为实现类似功能很容易。


1
如果您正在使用ASP.Net,那么您可以使用多个验证控件。这些控件以非常通用的方式编写,因此它们中的大多数自动在客户端和服务器之间重复您的验证逻辑,即使您只在一个地方设置控件选项。
您也可以自由继承它们以创建其他特定于领域的验证器,并且网上有第三方控件包可供获取,可以添加到基本控件中。
即使您没有使用ASP.Net,查看如何执行此操作也是值得的。这将为您提供如何在自己的平台上执行类似操作的想法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接