Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用一个CustomValidator验证多个错误_C#_Asp.net_Validation_Business Objects_Customvalidator - Fatal编程技术网

C# 使用一个CustomValidator验证多个错误

C# 使用一个CustomValidator验证多个错误,c#,asp.net,validation,business-objects,customvalidator,C#,Asp.net,Validation,Business Objects,Customvalidator,我试图弄清楚如何在业务对象上使用验证 到目前为止,我只看到CustomValidator上只检查1个错误的示例。我有两个带有DateTime输入的字段,可以检查3个或更多错误。我想通常我应该先检查客户端,然后检查服务器,最后检查数据库级别 如果某个字段出现错误,我将无法离开该字段 在客户端验证中,这不是一个会导致异常的错误,因为它只是一个用户错误。但是,如果出现问题,用户绕过了客户端验证,服务器验证应该引发异常 最后,如果我有其他工作,例如批量更新工作,那么他们应该使用数据库验证代码。如果我遗

我试图弄清楚如何在业务对象上使用验证

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

  • 如果某个字段出现错误,我将无法离开该字段
  • 在客户端验证中,这不是一个会导致异常的错误,因为它只是一个用户错误。但是,如果出现问题,用户绕过了客户端验证,服务器验证应该引发异常
  • 最后,如果我有其他工作,例如批量更新工作,那么他们应该使用数据库验证代码。如果我遗漏了一些基本的东西,请纠正我
  • `dateFrom'不是空的。(但“dateTo”可以为空)
  • `dateFrom'早于dateTo`
  • `dateFrom`和dateTo`在常数'MinDate'和'MaxDate'内`
  • 那么,我的验证应该是什么样子,客户端、服务器和数据库

    想法:

    验证逻辑是否应在3个不同的地方分开;用户界面、代码和数据对象(数据库)?当它是完全相同的代码时?似乎多余


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

    通常,业务层中的验证是好的;JS验证也很好,因为它有助于减少往返。对于CustomValidator,有一个cleintvalidationfunction属性,它采用要在客户端上验证的方法的名称,将其设置为要执行验证的方法的名称(请查看MSDN文档,抱歉,没有现成的链接,但MSDN有一个明确的示例)

    此外,对于服务器,servervalidate事件也可以从代码中激发以验证表单,并且您也可以在此处执行DB检查


    不确定您在DataObject(数据库)中执行了哪些检查?

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

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

    对于您的示例中的验证,我将在我的业务对象和三个CustomValidator上创建三个验证方法-每个验证程序将在服务器端的业务对象上调用相应的方法。我还将编写一些JavaScript以在客户端运行,因此服务器端代码的存在只是为了捕获未启用JavaScript的浏览器或恶意构建的HTTP请求


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

    这样我只验证一个错误,并在验证摘要中列出一个错误。如何使其验证3个或更多错误,并在ValidationSummary中列出所有错误,而不为我要检查的每个验证使用3个或更多错误?目前对DataObject(数据库)的检查不存在,但应在客户端和服务器验证+DB特定规范中检查相同的内容。ServerValidate可让您完全控制验证内容;您可以通过尝试更改erorrmessage属性来调整消息,或者在Page.Validators集合中找到验证器(您甚至可以将验证器插入此集合以发出错误信号,我以前是通过创建一个始终返回错误并实现IValidator接口的验证器来执行此操作的)。因此,可以选择使用一个customvalidator;您只需编写代码来处理所有条件并输出正确的消息。