I'm creating an html5 site in VS2010 using .net 4.0 and the stock validators. To make the validators accessible I've added an aria-labelledby to the associated textbox and set the validators id in the aria-labelledby value. The validators have their id mode set to static. Validation labels are hidden by display:none css styling, which is removed when triggered.
Seems to work fine, as NVDA sees the error message and is associating it to the proper text box. But when I go to validate it I get the following error:
aria-labelledby attribute must point to an element in the same document
So, the question is ... can the aria-labelledby reference a control that is not visible?
Quick answer is yes ... after some more testing I found out that NVDA will read the hidden span tag that is the validator error text.
The issue I was having was in making a required validator have its error message receivable by NVDA. Unfortunately the error is shown after the IsValid function is fired ... making the event fire after a postback. NVDA would see the page with the error messages, but not know that they were new.
To fix it I'm firing the validator on the blur event, as shown below.
I added a blur event to the control being validated, and called the validator attached to that control
onblur="validateControl(RequiredFieldValidatorID)"
The function called uses the ValidatorValidate function.
function validateControl(n) {
ValidatorValidate(n);
}
This makes a required validator fire on blur. Still need to refocus on the control that has an error, but I think I'll need to catch the tab and redirect ... work in progress.
Related
I have some input fields, regular expression validators, and custom validators inside an ASP.NET ASCX control. The behavior is a bit odd in that it works the following way:
If a client side validator flags an error message and I tab away from the input field and click submit then the page posts as it should. However, if a client side validator has flagged an error and instead I correct the error and click submit button then the error is cleared but the page is not submitted until I click the submit button a second time.
My question is how do I change this behavior such that I only need to click the submit button once to both clear the error and postback the page? Also, is this "behavior" standard?
Update: This behavior occurs without using the user control. I believe it is specific behavior to the CompareValidator. Nope, same behavior occurs with custom validator. If I don't "tab away" and click the button then I must click it twice to get the postback to occur. The first click just clears the validators.
The issue is that the CustomValidator has display type as Dynamic and not Static. This post helped me to discover the answer
RequiredFieldValidator have to click twice
I will give credit for anyone who explains why it causes this behavior.
I have a RegularExpressionValidator for a TextBox in a control, which itself is part of another control. When I click the button to submit the form, it seems that it should not do so unless all child controls are properly validated. However, what ends up happening is that I see the validation error message pop up for each control that failed to validate before the page posts back anyway and fails when it can't parse the malformed input.
I have tried surrounding the failing code with if (Page.IsValid) {...} to make sure it doesn't run without complete validation, but the property ends up being true by the time I hit the breakpoint.
Shouldn't an entire page be invalid if any child controls are not successfully validated?
Do you have different ValidationGroup controls defined? As long as the validators in the same validation group as the button are all setup correctly, yes it should block. Unless, for some reason, the JS is failing to load for the validators.
HTH.
Set "CausesValidation = true " to your submit button, I guess your problem will be solved.
Have you called Page.Validate() before using Page.IsValid ?
I seem to have a bit of a bug, I have a ASP.NET repeater control with a link buttons in it and the link button has the have the causes validation property set to false.
However; when clicking it which makes a panel visible on the web page, the asp.net required field validator controls trigger and shows their error messages. On those controls that I have the validator controls on.
Any ideas as to what might cause it to be ignoring the causes validation property set to false?
On my opinion, you should set different ValidationGroup properties values for repeater control and for control that is the source for required field validator. It is possible that container for repeat control has raised event that can be heared by required field validator.
If mentioned above cannot help then try to disable client validation for RequiredFieldValidator using EnableClientScript="False" for it. And activate RequiredFieldValidator when it really usefull. For example in the some button event handler you can apply such code:
MyButton.Validate();
if (MyButton.IsValid)
{
Do what you want...
}
For anybody that has this problem and stumbles across this post, here's what I found.
Turns out the problem was happening because I had EnableViewState="false" set on the Repeater. This was breaking the event postback somehow, and making every validator on the page fire. All I had to do was manually call DataBind() on the Repeater from within Page_Load(), and it cleared right up.
try to set the visablity of the panel true all the time in design view,, and check the validation again.
I have one asp content page.Its contain many controls like dropdownlist,textbox etc.All controls are inside a div tag.I gave required field validator for all my drop down list.i have one SAVE button that reside inside another div tag.I gave SAVE button cause validation true.But my problem is that, the validator is not working and the page.Isvalid property is true.What is the problem with my code?
Please make sure you have set the ControlToValidate property to the DropDownList id. Also you need to set the InitialValue property on the RequiredFieldValidator when validating a DropDownList. This basically just tells the Validator which item is the intial value (which will throw a validation error when it is selected).
Hope this helps,
Neil
UPDATE : Figured it out..
The objects I was passing to the ValidatorHookupControl were'nt being set properly (were null). Now that they are, the messages are currectly dissapearing when the hooked up control looses it's focus.
ORIGINAL POST ..
Hi,
I have some ClientValidation controls that have ClientSideValidation methods which work fine when validating the page..
However, how can I make it so that when a certain control that a CustomValidators clientside method kicks in and udates the validation message depending on whether the validation has passed or not. (Like the RequiredFieldValidator or RegExValidator).
My Customvalidators do not have their ControltoValidate properties set as some of them depend on multiple controls.
I don't want any postbacks (full or partial).
I have tried..
Adding an onchange attribute on dropdowns, radioboxes and checkboxes that call a helper clientside method which calls Page_ClientValidate('GroupName'), then setting window.location back to the control in question (as it went back to top of screen).
Using this method the args.IsValid is still being set by the ClientSideValidation method.
And I have tried ValidatorHookupControl (control, validator) but that doesn't seem to work either.
Any thoughts..?
My bad, was passing null objects into the ValidatorHookupControl method.
Works now. Doh!