Reputation: 22662
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
Page_Load
?Page.IsValid
?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 runningPage.Validate()
method which is invoked implicitly somewhere afterPage_Load
. In case you keep all of your logic in a Page_Load event handler (which is highly discouraged!), call thePage.Validate()
before checking thePage.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:
Upvotes: 39
Views: 72895
Reputation: 1857
Submit button should have same validation group as validator control has. For example
<asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />
Upvotes: 1
Reputation: 10515
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.
Upvotes: 38