How does Page.IsValid work?
asp.net, validation
Solution
Validation occurs after `Page_Load`, but before event handlers (See http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx).
If your button does not cause validation, you must manually fire `Page.Validate.`
You may not interrogate `Page.IsValid` until after (1) you have called `Page.Validate` or (2) a control that causes validation was the source of/included in a postback.
If you require validation to occur before event handlers fire, you may use:
if (Page.IsPostback)
{
Page.Validate( /*Control Validation Group Name Optional*/ );
if (Page.IsValid)
{
//Do some cool stuff
}
}
You may also want to consider redesigning so you aren't required to do so.
In an event handler that handles a control which causes validation, `Page.IsValid` is guaranteed to be available. In all other cases, it is generally safer to re-request validation. One model for handling submissions on a form that has validators:
void btnSubmit_Click(object sender, EventArgs e)
{
this.UpdateGUIWithSubmitRequest();
if (Page.IsValid)
{
this.ProcessSuccessfulSubmission();
}
else
{
this.ProcessInvalidSubmission();
}
}
If you are using a `CustomValidator` that has a very expensive validation step, you may consider caching the result in the `HttpResponse.Cache` so you do not have to re-validate if multiple calls to Page.Validate occur.
void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
CustomValidator self = (CustomValidator)source;
string validatorResultKey = self.ClientID;
bool? validatorResult = Context.Items[validatorResultKey] as bool?;
if (validatorResult.HasValue)
{
args.IsValid = validatorResult.Value;
return;
}
bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
Context.Items[validatorResultKey] = isValid;
args.IsValid = isValid;
}
This, of course, depends 100% on your architecture and whether or not you are able to assume that a passed/failed validation during initial validation still passes/fails during subsequent validations of the same Page Life Cycle.
Problem
I have following code with a `RequiredFieldValidator`. The `EnableClientScript` property is set as "false" in the validation control. Also I have disabled script in browser. I am NOT using `Page.IsValid` in the code behind. Still, when I submit without any value in textbox I will get `error message`. From comments of @Dai, I came to know that this can be an issue, if there is any code in `Page_Load` that is executed in a `postback`. There will be no validation errors thrown. (However, for button click handler, there is no need to check `Page.IsValid`) ``` if (Page.IsPostBack) { string value = txtEmpName.Text; txtEmpName.Text = value + "Appended"; } ``` QUESTION - Why does not the server side validation happen before `Page_Load`? - Why does it work fine when I use `Page.IsValid`? - Can you provide any reference to an article that explains this? (Not something that says - always use `Page.IsValid`; but something that says what are the mandatory scenarios to use `Page.IsValid` UPDATE 1 Refer ASP.NET Validators Common Misconception `Page.IsValid` is accessible only after running `Page.Validate()` method which is invoked implicitly somewhere after `Page_Load`. In case you keep all of your logic in a Page_Load event handler (which is highly discouraged!), call the `Page.Validate()` before checking the `Page.IsValid`. Note: It is advised not to keep all the logic in `Page_Load`. If something is to happen on button click event, move it to button click event handler. If something is to happen on drop-down event, move it to drop-down selected item change event handler. UPDATE 2 It seems like, we need to add `If(Page.IsValid)` in `button click` also if we are using a `Custom Validator` with server side validation. Refer CustomValidator not working well. Note: Client side validation question is present here: Whether to use Page_IsValid or Page_ClientValidate() (for Client Side Events) MARKUP ``` <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript"> alert('haiii'); </script> </head> <body> <form id="form1" runat="server"> <div> <asp:ValidationSummary runat="server" ID="vsumAll" DisplayMode="BulletList" CssClass="validationsummary" ValidationGroup="ButtonClick" /> <asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="valEmpName" runat="server" ControlToValidate="txtEmpName" EnableClientScript="false" ErrorMessage="RequiredFieldValidator" Text="*" Display="Dynamic" ValidationGroup="ButtonClick"></asp:RequiredFieldValidator> <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" ValidationGroup="ButtonClick" /> </div> </form> </body> </html> ``` CODE BEHIND ``` protected void Button1_Click(object sender, EventArgs e) { string value = txtEmpName.Text; SubmitEmployee(value); } ``` References: - Should I always call Page.IsValid? - ASP.NET Validation Controls – Important Points, Tips and Tricks - CustomValidator not working well