CustomValidator ServerValidate 方法不触发

问题描述 投票:0回答:3

我在表格上打了

CustomValidator
。我还没有设置它的
ControlToValidate
属性。在其
ServerValidate
事件中,我写了以下内容:

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

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

  1. 按钮和
    ValidationGroup
    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" />
c# asp.net customvalidator
3个回答
28
投票

尝试通过

Page.Validate
在按钮单击处理程序中强制进行验证:

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

编辑(来自评论):

如果您希望自定义验证器验证控件中是否未输入/选择任何内容,则需要将

ValidateEmptyText
设置为 true。您可能还想让
CustomValidator
取代
RequiredFieldValidators

我假设如果先前的验证器已经创建了

Page.IsValid=false
,则 aspx 上的验证器顺序决定是否调用自定义验证器的 severvalidate。或者 ASP.NET 非常智能,它假设
SeverValidate
比简单的文本为空检查更昂贵。


1
投票

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

以下是使 CustomVCaidators 和其他内置验证器同时工作的方法。:

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

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


0
投票

添加现有答案:

如果已验证的控件放置在不可见的控件内(例如,如果放置在设置为

asp:Panel
Visible = false
中),则不会触发验证。

要解决此问题,我们可以暂时使其可见,例如:

// assuming SomeUpdatePanel contains SomePanel
SomePanel.Visible = true;
SomeUpdatePanel.Update(); 
Page.Validate();
SomePanel.Visible = false;
SomeUpdatePanel.Update();
© www.soinside.com 2019 - 2024. All rights reserved.