CustomValidator ServerValidate方法不触发。

12

我在表单上放置了一个CustomValidator。我没有设置它的ControlToValidate属性。在它的ServerValidate事件中,我编写了以下代码:

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

我在这个方法中设置了断点,但似乎从未到达那个点。但是如果我在另一个窗体上这样做,它就像魅力一样有效。

  1. 按钮和CustomValidator的ValidationGroup属性相同
  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" />
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

我假设在aspx页面上的验证器顺序决定了当先前的验证器已经将Page.IsValid=false设置为false时,是否调用自定义验证器的SeverValidate。或者ASP.NET很聪明,它会认为SeverValidate比简单的文本为空检查要更昂贵。


1
@MikeJM:我不知道。你在页面加载时进行数据绑定吗?你在其他地方调用了Page.Validate()吗?你有任何JavaScript错误吗?必填字段验证器是否阻止了回发?它是否根本回发? - Tim Schmelter
4
谢谢,ValidateEmptyText对我很有帮助。 - makambi
哇..这个属性真不清楚哈哈,幸好我看到了这篇帖子,否则我就找不到它了。谢谢大家! - Rushino
我也遇到了这个问题,当上传CustomValidator以验证控件中是否未输入/选择任何内容时,我只需将ValidateEmptyText设置为true,就像魔术般地工作。 - Santosh Kumar
<asp:CustomValidator ID="CV_FUp_Front" runat="server" ErrorMessage="Max size 100KB. Upload only JPEG/JPG/PNG format" ValidateEmptyText="true" ClientValidationFunction="ValidateFile" OnServerValidate="ValidateFile_FUp_Front" Display="Dynamic" ValidationGroup="Submit" ControlToValidate="FUp_Front" Font-Size="8pt" CssClass="error" /> - Santosh Kumar
显示剩余6条评论

1

我还想为那些同时使用CustomValidators和RequiredFieldValidators的人提供更多帮助。需要考虑到客户端验证首先发生,而服务器端验证仅在PostBack之后发生。我相信你已经明白了,但以防万一不太清楚:这意味着首先所有绑定到某些客户端工作验证器的控件必须有效才能让PostBack发生。在Page.IsValid为True之后,服务器端的内容才会发生,并返回任何更改,包括服务器端验证消息。

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

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

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


1
在现有答案的基础上补充一点:
如果验证控件放在一个不可见的控件内(例如,放在一个设置为Visible = falseasp:Panel中),验证将不会被触发。
为了解决这个问题,我们可以暂时将其设置为可见,例如:
// assuming SomeUpdatePanel contains SomePanel
SomePanel.Visible = true;
SomeUpdatePanel.Update(); 
Page.Validate();
SomePanel.Visible = false;
SomeUpdatePanel.Update();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接