CustomValidator ServerValidate method does not fire

Mikayil Abdullayev picture Mikayil Abdullayev · Apr 16, 2012 · Viewed 20.9k times · Source

I've put a CustomValidator on my form. I have not set its ControlToValidate property. In its ServerValidate event I've written the following:

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

I put a breakpoint to this method but it seems to never come to that point. But if I do this on another form it works like a charm.

  1. The ValidationGroup property of both the button and the CustomValidator are the same
  2. I tried deleting this property in both the button and the CustomValidator, still does not work.

It seems as there's something formwide. I just put a CustomValidator on the form and do not touch any of its properties other than just setting its ServerValidate event method.

EDIT: Here's the aspx part:

 <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" />

Answer

Tim Schmelter picture Tim Schmelter · Apr 16, 2012

Try to force the validation in the button-click handler via Page.Validate:

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

Edit(from comments):

If you want the customvalidator to validate if nothing was entered/selected in your controls, you need to set ValidateEmptyText to true. You also might want to let the CustomValidator replace the RequiredFieldValidators.

I assume that the validator-order on the aspx decides whether or not a customvalidator's severvalidate is called if a previous Validator already has made Page.IsValid=false. Or ASP.NET is so smart that it assumes the SeverValidate to be costlier than a simple text-is-empty check.