Page.IsValid always returning true with ValidationGroup and dynamic CustomValidator

asp.netvalidation

I am adding a custom validator to the page programmatically on click of a button, then validating the page and checking the IsValid property of the page. but the IsValid property is always returning true. Please help. here is the code. I need to add custom validator dynamically to show validation messages from business object. I am setting the IsValid property of the custom validator to false, so I expect the IsValid property of the Page to return false as well after validation. can't understand what I am doing wrong here.

    protected void Button1_Click(object sender, EventArgs e)
{
    var validator = new CustomValidator();
    validator.IsValid = false;
    validator.ErrorMessage = "The input is invalid";
    validator.ValidationGroup = "vgCustom";
    Page.Validators.Add(validator);
    ValidationSummary1.ValidationGroup = "vgCustom";
    Page.Validate("vgCustom");
    Label1.Text = Page.IsValid ? "The Page is valid" : "The Page is Invalid";
}

and here is the HTML mark-up

<html xmlns="http://www.w3.org/1999/xhtml" >
 <head runat="server">
    <title></title>
 </head>
 <body>
    <form id="form1" runat="server">
    <div>
        <asp:ValidationSummary ID="ValidationSummary1" runat="server"/>
        <asp:Button ID="Button1" runat="server" Text="Validate" OnClick="Button1_Click" />
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
 </body>
</html>

Best Answer

i had the same problem with RequiredFieldValidator (Page.IsValid was always true) i had a panel i wanted to show only when validation is false:

<asp:Panel ID="PanelValidationMessage" CssClass="hide messegeFailed" runat="server">
   <p><asp:RequiredFieldValidator ID="RequiredFieldValidatorProductForTransfer" 
                                  runat="server"
                                  ValidationGroup="Transfer"
                                  ErrorMessage="Please Select Product for Transfer"
                                  ControlToValidate="DDLProductForTransfer"
                                  InitialValue="0"
                                  SetFocusOnError="true"
                                  Display="Dynamic"></asp:RequiredFieldValidator></p>

</asp:Panel>

it was resolved after i changed the "CausesValidation" attribute of the button from "true" to "false":

<asp:Button ID="BtnTransfer" 
            runat="server" 
            Text="Transfer Products" 
            onclick="BtnTransfer_Click" 
            ValidationGroup="Transfer"
            CausesValidation="false"/>

code behind:

Page.Validate("Transfer");
        if (Page.IsValid)
        {
            PanelValidationMessage.CssClass = "hide messegeFailed";
        }
        else
        {
            PanelValidationMessage.CssClass = "show messegeFailed";
        }
Related Topic