使用一个CustomValidator验证多个错误

时间:2010-02-22 13:44:37

标签: c# asp.net validation business-objects customvalidator

我试图弄清楚如何在Business Objects上使用验证。

到目前为止,我只看到 CustomValidator 上仅检查1个错误的示例。我有两个带DateTime输入的字段,应检查3个或更多错误。我想通常我应该检查客户端,然后在服务器上,最后在数据库级别。

  • 如果我在某个字段上收到错误,我就不能离开该字段。
  • 在客户端验证中,这不是导致异常的错误,因为它只是用户错误。但是,如果出现问题并且用户绕过了客户端验证,则服务器验证应该会出现异常。
  • 最后,如果我有其他例如批量更新工作然后他们应该使用数据库验证代码。如果我错过了一些基本的东西,请纠正我!
  1. `dateFrom`不为空。 (但`dateTo`可以为空)
  2. `dateFrom`早于`dateTo`
  3. `dateFrom`和`dateTo`在常量`MinDate`和`MaxDate`
  4. 之内

    那么我的验证应该如何,客户端,服务器和数据库?

    思考

    验证逻辑应该在3个不同的地方分开; UI,代码和DataObject(数据库)?当它是完全相同的代码?似乎多余了?

    我可以对所有三项检查使用相同的验证方法吗?或者我是否需要实现3个代码块,每个3个方法,然后如何在ValidationSummary中很好地列出所有代码块?

2 个答案:

答案 0 :(得分:2)

为了减少代码重复及其产生的错误,所有验证代码都应该在一个层中 - 最好是业务层,因为它最适合评估对象并确定它是否有效。 / p>

然而,虽然这是一种理论上的理想,但在现实世界中却往往不实用。在客户端 - 服务器环境(如ASP.NET)中,您希望在客户端尽可能多地复制验证,以减少到服务器的往返。此外,如果您有其他业务程序(例如批量上传)触及您的表而不通过您的业务对象,您还需要在数据库中实现验证,以防止创建垃圾数据。

对于像您的示例中的验证,我将在我的业务对象和三个CustomValidator上创建三个验证方法 - 每个验证器将在服务器端的业务对象上调用相应的方法。我还会编写一些JavaScript来在客户端运行,因此服务器端代码只能用于捕获非JavaScript启用的浏览器或恶意制作的HTTP请求。

对于在JavaScript中很难做到的验证(即需要业务对象),我不会打扰CustomValidator。相反,这些验证会等到用户按下提交按钮,此时我可以使用业务对象来验证自身并返回任何错误。

答案 1 :(得分:1)

通常,业务层中的验证通常是好的; JS验证也很好,因为它有助于减少往返次数。对于CustomValidator,有一个cleintvalidationfunction属性,它取一个方法的名称在客户端上进行验证,将其设置为进行验证的方法的名称(请查看MSDN文档,对不起,没有方便的链接,但MSDN有一个明确的例子。)

此外,对于服务器,还可以触发servervalidate事件以从代码验证表单,并且您也可以在此处执行数据库检查。

不确定你在DataObject(数据库)中做了什么检查?