2010-02-22 82 views
2

我想弄清楚如何在业务对象上使用验证。用一个CustomValidator验证多个错误

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

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

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

思想

如果验证逻辑在3米不同的地方进行分离;用户界面,代码和数据对象(数据库)?当它是完全相同的代码?似乎多余?

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

回答

2

为了减少代码重复和由此产生的误差,所有的验证代码应该是在一个单一的层 - 优选业务层,因为它是在评价对象,并确定其是否有效或不是最好的位置。

然而,尽管这是一个理论上的理想,它往往是在现实世界中的情况不务实。在客户端 - 服务器环境中,如ASP.NET,您希望尽可能在客户端重复验证,以减少往返服务器的次数。此外,如果您有其他业务过程(例如批量上传)在不通过业务对象的情况下触摸您的表,则还需要在数据库中实施验证,以防止创建垃圾数据。

对于像你的榜样,我会创造我的业务对象的三种验证方法和三个CustomValidators验证 - 每个校验器将调用服务器端业务对象上相应的方法。我还会编写一些JavaScript以在客户端运行,因此服务器端代码只存在于捕获未启用JavaScript的浏览器或恶意制作的HTTP请求。

进行验证是难以在JavaScript中执行(即需要业务对象),我不会用的CustomValidator麻烦。相反,那些验证会等到用户按下提交按钮,此时我可以使用业务对象来验证自己并返回任何错误。

1

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

另外,对于服务器的的ServerValidate事件也火来验证从代码的形式,你可以在这里做的DB检查过。

不知道哪些检查你的数据对象(数据库)吗?

+0

不过这样一来,我只是确认一个错误,并列出了一个错误的验证摘要。我怎样才能使它生效3个或更多的错误,并列出所有的人都在ValidationSummary,而无需使用3个或更多的每个验证我要检查? 对数据对象(数据库)的检查,现在的问题是不存在的,但应该检查同样的事情在客户端和服务器验证+ DB的具体规格。 – Niike2 2010-02-22 14:32:10

+1

ServerValidate让你完全控制什么得到验证;你可以试着改变erorrmessage财产,或发现在Page.Validators集合(你甚至可以注入验证这个集合发出一个错误的验证调整的消息,我用来做这种通过创建一个验证器总是返回一个错误并且实现了IValidator接口)。所以有使用一个customvalidator的选项;您只需编写代码来处理所有条件并输出正确的消息。 – 2010-02-22 16:48:23

相关问题