我试图弄清楚如何在Business Objects上使用验证。
到目前为止,我只看到 CustomValidator 上仅检查1个错误的示例。我有两个带DateTime输入的字段,应检查3个或更多错误。我想通常我应该检查客户端,然后在服务器上,最后在数据库级别。
那么我的验证应该如何,客户端,服务器和数据库?
思考:
验证逻辑应该在3个不同的地方分开; UI,代码和DataObject(数据库)?当它是完全相同的代码?似乎多余了?
我可以对所有三项检查使用相同的验证方法吗?或者我是否需要实现3个代码块,每个3个方法,然后如何在ValidationSummary中很好地列出所有代码块?
答案 0 :(得分:2)
为了减少代码重复及其产生的错误,所有验证代码都应该在一个层中 - 最好是业务层,因为它最适合评估对象并确定它是否有效。 / p>
然而,虽然这是一种理论上的理想,但在现实世界中却往往不实用。在客户端 - 服务器环境(如ASP.NET)中,您希望在客户端尽可能多地复制验证,以减少到服务器的往返。此外,如果您有其他业务程序(例如批量上传)触及您的表而不通过您的业务对象,您还需要在数据库中实现验证,以防止创建垃圾数据。
对于像您的示例中的验证,我将在我的业务对象和三个CustomValidator上创建三个验证方法 - 每个验证器将在服务器端的业务对象上调用相应的方法。我还会编写一些JavaScript来在客户端运行,因此服务器端代码只能用于捕获非JavaScript启用的浏览器或恶意制作的HTTP请求。
对于在JavaScript中很难做到的验证(即需要业务对象),我不会打扰CustomValidator。相反,这些验证会等到用户按下提交按钮,此时我可以使用业务对象来验证自身并返回任何错误。
答案 1 :(得分:1)
通常,业务层中的验证通常是好的; JS验证也很好,因为它有助于减少往返次数。对于CustomValidator,有一个cleintvalidationfunction属性,它取一个方法的名称在客户端上进行验证,将其设置为进行验证的方法的名称(请查看MSDN文档,对不起,没有方便的链接,但MSDN有一个明确的例子。)
此外,对于服务器,还可以触发servervalidate事件以从代码验证表单,并且您也可以在此处执行数据库检查。
不确定你在DataObject(数据库)中做了什么检查?