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

时间:2020-03-05 18:46:28  来源:igfitidea点击:

在我之前的问题中,大多数评论者都认为在客户端和服务器端都具有验证逻辑是一件好事。

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

那么问题是我们如何处理呢?

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

我很想听听意见。
我们是否有某种标准程序来处理此问题?或者,也许我们认为这根本不是问题? :)

编辑:

伙计们,首先感谢回答。

明天我将为我们总结答案并更新问题的文本,例如在这种情况下

解决方案

回答

如另一篇文章的答案之一所述,如果要使各层分开,则没有很好的方法来避免在每层中重复验证逻辑。如果使用某些东西将它们自动绑在一起,则可能会在各层之间引入某种耦合,这可能会阻碍我们前进。这可能是我们仅需手动跟踪情况的情况之一。

无论我们做什么,都必须确保每个层都在进行自己的验证,因为我们永远不知道将如何访问该层。不能保证我们实现的所有层都将始终保持在一起。

回答

我喜欢使用验证服务,该服务不一定关心要验证的数据的来源。当我们涉及到将验证规则传输到客户端(即网页)的部分时,这可以通过几种不同的方式起作用,但是我觉得这方面最重要的方面是对实际验证规则具有单一权限。

例如,如果我们在数据核心实体上具有验证逻辑,例如通过Validate方法检查的ValidationRule对象的集合(这是非常典型的情况),那么我将通过转换将这些相同的规则提升给客户端(javascript)。

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

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

  • 验证应尽可能靠近输入数据和提交数据的位置进行。
  • 无论在何处进行验证,都应使用相同的验证规则-如果客户端验证通过,则以后再也不会失败(预先保存的业务规则,违反外键等)。

回答

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

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

回答

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

我们还可以自由地从它们继承来创建其他特定于域的验证器,并且我们可以在网络上获得第三方控制包,并将其添加到基本控件中。

即使我们没有使用ASP.Net,也值得一看。它将为我们提供有关如何在自己的平台中执行类似操作的想法。