12

我已经CustomValidator在我的表格上写了一个。我没有设置它的ControlToValidate属性。在它的ServerValidate事件中,我写了以下内容:

protected void CustomValidator1_ServerValidate(object source,      
                                               ServerValidateEventArgs args)
{
    args.IsValid = false;
}

我给这个方法设置了一个断点,但它似乎永远不会到达那个点。但如果我在另一种形式上这样做,它就像一个魅力。

  1. ValidationGroupbutton 和 the的属性CustomValidator是一样的
  2. 我尝试在按钮和 中删除此属性,但CustomValidator仍然不起作用。

似乎有某种形式。我只是在表单上放了一个,除了设置它的事件方法CustomValidator之外,不触及它的任何属性。ServerValidate

编辑:这是 aspx 部分:

 <asp:CustomValidator ID="CustomValidator2" runat="server" 
       ErrorMessage="This is a test" 
   onservervalidate="CustomValidator1_ServerValidate" 
   ValidationGroup="PA"></asp:CustomValidator>


<asp:Button ID="btnPensionersOK" runat="server" Text="OK" Width="75px" 
          onclick="Button1_Click" ValidationGroup="PA" />
4

2 回答 2

28

尝试通过以下方式强制在按钮单击处理程序中进行验证Page.Validate

protected void Button1_Click(Object sender, EventArgs e)
{
    Page.Validate();
    if(Page.IsValid)
    {
       // servervalidate should have been called
    }
}

编辑(来自评论):

如果您希望 customvalidator 验证您的控件中是否没有输入/选择任何内容,则需要设置ValidateEmptyText为 true。您可能还想让CustomValidator替换RequiredFieldValidators.

我假设 aspx 上的验证器顺序决定是否调用 customvalidator 的 severvalidate 如果以前的验证器已经制作了Page.IsValid=false. 或者 ASP.NET 非常聪明,以至于它假设SeverValidate比简单的 text-is-empty 检查更昂贵。

于 2012-04-16T10:43:49.513 回答
1

我还想为同时使用 CustomValidators 和 RequiredFieldValidators 的人提供更多帮助。应该考虑到首先进行客户端验证。并且服务器端验证只会在 PostBack 之后发生。我相信你明白了,但以防万一这不是很清楚:这意味着首先绑定到某些客户端工作验证器的所有控件必须有效才能让 Postback 发生。在页面之后。IsValid 是真正的服务器端内容,并回发包括服务器端验证消息在内的任何更改。

因此,以下是使 CustomVCalidators 和其他内置验证器同时工作的方法:

  1. 将两组验证器设置为在客户端工作。在这种情况下,我们必须确保为自定义验证器指定将在客户端进行验证的脚本。无需编写脚本,只需填写 ServerValidate 方法,验证将在服务器中进行。即使 EnableClientScript 属性设置为 True。

  2. 将两组验证器设置为在服务器端工作。为此,只需将 EnableClientScript 设置为 False。但请注意,这将加载服务器。

于 2012-04-16T13:09:34.460 回答