Basically, I've got code that looks like this:
<div>
<asp:TextBox ID="txtBox1" class="inline-block" runat="server" />
<asp:RegularExpressionValidator ID="regExTxtBox1" runat="server" ControlToValidate="txtBox1" ErrorMessage="Enter an integer or decimal greater than 0." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:RequiredFieldValidator ID="reqFldTxtBox1" runat="server" ControlToValidate="txtBox1" ErrorMessage="Requires a number." Display="Dynamic" InitialValue="" />
<asp:CompareValidator id="cmprTxtBox1" runat="server" ControlToValidate="txtBox1" ControlToCompare="txtBox2" Type="Double" Display="Dynamic" Operator="LessThanEqual" Text="Error: txtBox1 is greater than txtBox2." />
</div>
<br />
<div>
<asp:TextBox ID="txtBox2" runat="server" />
<asp:RegularExpressionValidator ID="regExTxtBox2" runat="server" ControlToValidate="txtBox2" ErrorMessage="Enter an integer or decimal greater than 0." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:RequiredFieldValidator ID="reqFldTxtBox2" runat="server" ControlToValidate="txtBox2" ErrorMessage="Requires a number." Display="Dynamic" InitialValue="" />
</div>
I've got two text boxes that use regular expression validators in order to force the user to only enter integers or decimals. I also want the input in txtBox2 to be larger than txtBox1, so I use a compare validator on txtBox1 in order to check for when the number in txtBox1 is larger than txtBox2.
The issue that I'm running into is that my CompareValidator always triggers when the RegularExpressionValidator triggers. The CompareValidator is perfectly content when there are normal numbers in txtBox1 and nothing in txtBox2. But it fails whenever the RegularExpressionValidator fails, regardless of what's in txtBox2.
Of course, the system functions correctly, because either way the user won't be able to enter any values when the validators are returning invalid. But I don't want the user to see unnecessary error messages.
If there isn't any solution I think I could implement a custom validator.
Please Check By Using Validation Group Property.....
For and Validation Control and put Same Validation Group To Submit Button so it will Validate On Button Click.....
I hope It Will Helps You.....
I figured out a workaround.
For the text box with the compare validator I added an 'onchange' call to a javascript method. In that method, it checks whether or not the regular expression has failed. If it has, it sets the compare validator to true and then updates the display.
The implementation in javascript looks like this:
function txtBoxChanged() {
var txtBox1 = document.getElementById('<%=txtBox1.ClientID%>').value;
var rgx = new RegExp(/^0*[1-9]+\d*(\.\d+)?$|^0*\.0*[1-9]+\d*$/)
if (!(rgx.test(txtBox1))) {
document.getElementById('<%=cmprTxtBox1.ClientID%>').isvalid = true;
ValidatorUpdateDisplay(document.getElementById('<%=cmprTxtBox1.ClientID%>'));
}
}
And my HTML:
<div>
<asp:TextBox ID="txtBox1" class="inline-block" runat="server" onchange="txtBoxChanged()" />
<asp:RegularExpressionValidator ID="regExTxtBox1" runat="server" ControlToValidate="txtBox1" ErrorMessage="Enter an integer or decimal greater than 0." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:RequiredFieldValidator ID="reqFldTxtBox1" runat="server" ControlToValidate="txtBox1" ErrorMessage="Requires a number." Display="Dynamic" InitialValue="" />
<asp:CompareValidator id="cmprTxtBox1" runat="server" ControlToValidate="txtBox1" ControlToCompare="txtBox2" Type="Double" Display="Dynamic" Operator="LessThanEqual" Text="Error: txtBox1 is greater than txtBox2." />
</div>
<div>
<asp:TextBox ID="txtBox2" runat="server" onchange="txtBoxChanged()" />
<asp:RegularExpressionValidator ID="regExTxtBox2" runat="server" ControlToValidate="txtBox2" ErrorMessage="Enter an integer or decimal greater than 0." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:RequiredFieldValidator ID="reqFldTxtBox2" runat="server" ControlToValidate="txtBox2" ErrorMessage="Requires a number." Display="Dynamic" InitialValue="" />
</div>
I had to make it so both text boxes were calling this method. Otherwise even when the regular expression failed on txtBox2 the compare validator would show up. Which makes sense because it is looking at both text boxes.
Related
I have one text box and these asp validation controls on it.
<asp:TextBox ID="txtMinLot" runat="server" CssClass="form-control" MaxLength="10" CausesValidation="false"> </asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="txtMinLot" ErrorMessage="Please enter min lot for Bidding" Font-Names="Arial" Font-Size="11px" Display="Dynamic" SetFocusOnError="True" ValidationGroup="check" ForeColor="Red"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator13" runat="server" ControlToValidate="txtMinLot" Display="Dynamic" ErrorMessage="Not a Valid number." Font-Size="11px" ForeColor="Red" SetFocusOnError="True" ValidationExpression="[0-9]*$" ValidationGroup="check" />
<asp:RangeValidator ID="rvLot" ControlToValidate="txtMinLot" runat="server" CssClass="result" Display="Dynamic" SetFocusOnError="True" ErrorMessage="Min Quantity should be less than Total Quantity and more than 0" Font-Size="11px" ForeColor="Red" MinimumValue="1" MaximumValue="100"></asp:RangeValidator>
But as i type something in character both range validator as well as regular expression validator message is showing in the page. But I want to show only one message at a time
In this case when you want the value in txtMinLot to be an integer number between 1 to 100, you don't need a regularexpression validator at all. you simply need to use a requiredfieldvalidater and rangevalidator; just like you did but with one change:
<asp:RangeValidator Type="Integer" ID
Type="Integer" will make sure user doesn't enter real numbers with decimal points and will only enter integers
Use regular expression "[1-9][0-9]?|100" and remove the range validator.
Another option is just to use a style (CSS) to hide the additional error messages. The exact rule will depend on what version of the validators you are using, so I'm not even going to guess, but if you post the HTML that is generated, it should be easy.
This is my aspx code
<p class="input-block last">
<asp:TextBox ID="uxEmployerName" runat="server" CssClass="uxemail" TabIndex="10" ValidationGroup="EmployerRegister" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="uxEmployerName" ErrorMessage="You must enter Company Name." EnableClientScript="false" Display="none" ValidationGroup="EmployerRegister" />
</p>
<p class="input-block last">
<asp:TextBox ID="uxEmail" runat="server" CssClass="uxemail" TabIndex="16" ValidationGroup="EmployerRegister" />
<asp:RequiredFieldValidator ID="uxEmailValReq" runat="server" ControlToValidate="uxEmail" ErrorMessage="You must enter Email." EnableClientScript="false" Display="none" ValidationGroup="EmployerRegister" />
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="The 'Email Address' you have entered does not appear to be a valid address." ControlToValidate="uxEmail" EnableViewState="False" ValidationExpression="\w+([-+.']\w+)*#\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="EmployerRegister" Display="None" />
</p>
<p class="input-block last">
<asp:LinkButton runat="server" ID="uxRegisterButton" Text="Submit" CausesValidation="true" ValidationGroup="EmployerRegister" CssClass="button" TabIndex="18" />
<a class="button" href="#" tabindex="17">Edit package</a>
</p>
the only validator works here is RegularExpressionValidator
if I input wrong email format then it shows the error message. but not if i leave the email field.
What am i doing wrong. any solution
i have also added a custom validator with the email field
<asp:CustomValidator ID="uxEmailValUnique" runat="server" ErrorMessage="It appears that you already have an account with us. <br/><a href='forgotten-password.aspx'>Request password</a>"
ControlToValidate="uxEmail" EnableViewState="False" ValidationGroup="EmployerRegister"
Display="None" />
the backend server code for this is
Private Sub uxEmailValUnique_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles uxEmailValUnique.ServerValidate
args.IsValid = Not LocalHelper.EmailExists(uxEmail.Text)
End Sub
where in LocalHelper file
Shared Function EmailExists(email As String) As Boolean
Return DB.GetInteger("select count(id) from [user] where deleted = 0 and active = 1 and email = #email", DB.SIP("email", email)) > 0
End Function
this does not work either
what am i doing wrong.
I assume that you have a ValidationSummary control similar to this:
<asp:ValidationSummary runat="server" ForeColor="Red" ValidationGroup="EmployerRegister" />
If any of your validators has client-side validation enabled (EnableClientScript="true", the default value), it will prevent the postback when the client validation fails, so that server-side validation will not be performed. In your current code, the RegularExpressionValidator has client-side validation enabled (not explicitly disabled, in fact); if it fails, the server-side validation for the required fields is not performed and the other error messages are not displayed.
You could disable the client-side validation for all your validators. The message would appear for all of them (if appropriate) every time you submit the form.
<asp:RequiredFieldValidator ID="uxEmployerNameValReq" EnableClientScript="false" ... />
<asp:RequiredFieldValidator ID="uxEmailValReq" EnableClientScript="false" ... />
<asp:RegularExpressionValidator ID="uxEmailExprVal" EnableClientScript="false" ... />
<asp:CustomValidator ID="uxEmailValUnique" EnableClientScript="false" ... />
Another reasonable approach could be to enable the client-side validator for the most basic requirements, and disable it for the CustomValidator. The more advanced validation does not make much sense if the e-mail is empty or not valid in the first place.
<asp:RequiredFieldValidator ID="uxEmployerNameValReq" EnableClientScript="true" ... />
<asp:RequiredFieldValidator ID="uxEmailValReq" EnableClientScript="true" ... />
<asp:RegularExpressionValidator ID="uxEmailExprVal" EnableClientScript="true" ... />
<asp:CustomValidator ID="uxEmailValUnique" EnableClientScript="false" ... />
N.B. In your question, you say that the validation message is not displayed when the e-mail field is empty. I haven't seen that behavior with your original code in my tests.
I've got two text boxes like this:
<asp:TextBox ID="textBox1" runat="server" />
<asp:RegularExpressionValidator ID="regExTextBox1" runat="server" ControlToValidate="textBox1" ErrorMessage="Not a positive real number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:RequiredFieldValidator ID="reqFldTextBox1" runat="server" ControlToValidate="textBox1" ErrorMessage="Enter a number." Display="Dynamic" />
<asp:TextBox ID="textBox2" runat="server" />
<asp:RegularExpressionValidator ID="regExTextBox2" runat="server" ControlToValidate="textBox2" ErrorMessage="Not a positive real number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:RequiredFieldValidator ID="reqFldTextBox2" runat="server" ControlToValidate="textBox2" ErrorMessage="Enter a number." Display="Dynamic" />
<asp:CompareValidator id="compareValidator" runat="server" ControlToValidate="textBox2" ControlToCompare="textBox1" Type="Double" Display="Dynamic" Operator="LessThan" Text="Error." />
It's two text boxes that have regular expression validators that constrain them to only allow positive real numbers. These work fine.
I also want the input in the second text box to be smaller than the first one. For that I have a compare validator.
When the user has correct numbers the compare validator works fine.
It's when they enter in anything that fails the second regular expression validator, that the compare validator also fires at the same time.
It doesn't matter what's in the first text box, valid input, wrong input, or even nothing. Both of the second validators fail.
Even though the validator is supposed to be comparing doubles.
Is there an easy fix for this?
I realize that this behavior is okay, because a validator is invalid when it should be, but the user would be seeing the incorrect error messages.
I've already done a solution involving custom validators and Javascript, and if it comes down to it then I'll have to do that again. But if that's the case then there's not much point to using a compare validator, since it'll never work with a regular expression validator.
Assign different validation groups to regular expression validator and compare validator and use ASP.NET inbuilt javascript function Page_ClientValidate() to check validation one by one.
<asp:TextBox ID="textBox1" runat="server" />
<asp:RegularExpressionValidator ID="regExTextBox1" runat="server" ControlToValidate="textBox1" ErrorMessage="Not a positive real number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" ValidationGroup="Group1" />
<asp:RequiredFieldValidator ID="reqFldTextBox1" runat="server" ControlToValidate="textBox1" ErrorMessage="Enter a number." Display="Dynamic" ValidationGroup="Group2"/>
<asp:TextBox ID="textBox2" runat="server" />
<asp:RegularExpressionValidator ID="regExTextBox2" runat="server" ControlToValidate="textBox2" ErrorMessage="Not a positive real number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" ValidationGroup="Group1" />
<asp:RequiredFieldValidator ID="reqFldTextBox2" runat="server" ControlToValidate="textBox2" ErrorMessage="Enter a number." Display="Dynamic" ValidationGroup="Group2" />
<asp:CompareValidator id="compareValidator" runat="server" ControlToValidate="textBox2" ControlToCompare="textBox1" Type="Double" Display="Dynamic" Operator="LessThan" Text="Error." ValidationGroup="Group3" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="return Validate()" />
In Javascript
<script type="text/javascript">
function Validate() {
var isValid = false;
isValid = Page_ClientValidate('Group1');
if (isValid) {
isValid = Page_ClientValidate('Group2');
}
if (isValid) {
isValid = Page_ClientValidate('Group3');
}
return isValid;
}
</script>
I think you should use Custom Validator for second textbox to confirm that Comparison logic occurs if regular expression validation passes. You could do it the following way-
<asp:Textbox id="textBox2" runat="server" text=""></asp:Textbox>
<asp:CustomValidator id="CustomValidator2" runat="server"
ControlToValidate = "textBox2"
ErrorMessage = "Your Error Message"
ClientValidationFunction="validateLength" >
</asp:CustomValidator>
<script type="text/javascript">
function validateLength(oSrc, args){
// your validation logic here
}
</script>
I'm having issues with asp.net's field validators taking up space on my page. I've searched around, and documentation says to use Display="Dynamic" to keep the validators from taking up space. When I use this however, the error messages are always displayed.
What am I doing wrong?
I just want the error messages to display when the user either clicks the "Save" button, or loses focus on a textbox. And I don't want the validators to take up space.
<p>Please enter a new email:</p>
<asp:TextBox runat="server" MaxLength="255" ID="TextBoxEmail" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
ValidationGgroup="Email"
ErrorMessage="Please enter an email"
ControlToValidate="TextBoxEmail" runat="server"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator2"
ValidationGroup="Email"
ControlToValidate="TextBoxEmail"
ErrorMessage="Please enter valid email"
runat="server"
ValidationExpression="\w+([-+.']\w+)*#\w+([-.]\w+)*\.\w+([-.]\w+)*" />
<p>Please re-enter your email:</p>
<asp:TextBox runat="server" ID="TextBoxEmail2" />
<asp:LinkButton ValidationGroup="Email" runat="server" Text="Save" OnClick="linkbuttonSave_Click" />
Only thing I notice in your code is you have a typo in ValidationGgroup="Email". It should be ValidationGroup="Email"
Other than that, Display="Dynamic" works for me.
After clicking, submit button -
<p>
Please enter a new email:</p>
<asp:TextBox runat="server" MaxLength="255" ID="TextBoxEmail" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" ValidationGroup="Email"
ErrorMessage="Please enter an email" ControlToValidate="TextBoxEmail" runat="server"
Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator2" ValidationGroup="Email"
ControlToValidate="TextBoxEmail" ErrorMessage="Please enter valid email" runat="server"
ValidationExpression="\w+([-+.']\w+)*#\w+([-.]\w+)*\.\w+([-.]\w+)*" Display="Dynamic" />
<p>
Please re-enter your email:</p>
<asp:TextBox runat="server" ID="TextBoxEmail2" />
<asp:CompareValidator ID="PasswordCompare" runat="server" ControlToCompare="TextBoxEmail"
ControlToValidate="TextBoxEmail2" CssClass="failureNotification" Display="Dynamic"
ErrorMessage="Must match." ValidationGroup="Email"></asp:CompareValidator>
<asp:RequiredFieldValidator ID="RequiredFieldValidator3" ValidationGroup="Email"
ErrorMessage="Please enter an confirm email" ControlToValidate="TextBoxEmail2" runat="server"
Display="Dynamic"></asp:RequiredFieldValidator>
<asp:LinkButton ID="LinkButton1" ValidationGroup="Email" runat="server" Text="Save"
OnClick="linkbuttonSave_Click" />
You can set the property Display to "Dynamic" or "none", the second one will cause the Error message to be displayed only in the validation summary.
I got it to work great by deleting the "ValidationGroup=.." . Havent looked what up what this does but it works great without it and not sure why it would be needed (given the validator controls have the control id of the email textbox)
I'm trying to figure out how the heck the validation summary control of ASP.NET (3.5 I think) works.
<asp:ValidationSummary ID="vldSummary" runat="server" DisplayMode="BulletList"
CssClass="error" EnableClientScript="true" />
<asp:RequiredFieldValidator ID="vldSubject" ControlToValidate="txtSubject"
EnableClientScript="false" Text="You must enter a subject." runat="server" />
<asp:RequiredFieldValidator ID="vldMessage" ControlToValidate="txtMessage"
EnableClientScript="false" runat="server" Text="You must enter a message." />
It seems that no matter what I do, the validation summary remains empty (but is rendered) and the errors are only displayed at the position of each respective validator.
What am I doing wrong?
Text property's value is what is displayed beside the control. You need to set the ErrorMessage property of the validators to control what is shown in the summary.
You want to set the ErrorMessage property on your validation controls. This text will be displayed by the ValidationSummary control.
Try:
<asp:ValidationSummary ID="vldSummary" runat="server" DisplayMode="BulletList" CssClass="error" EnableClientScript="true" />
<asp:RequiredFieldValidator ID="vldSubject" ControlToValidate="txtSubject" EnableClientScript="false" ErrorMessage="You must enter a subject." runat="server" />
<asp:RequiredFieldValidator ID="vldMessage" ControlToValidate="txtMessage" EnableClientScript="false" runat="server" ErrorMessage="You must enter a message." />
Set the ErrorMessage property on the RequiredFieldValidators, not the Text property.
<asp:RequiredFieldValidator ID="vldSubject" ControlToValidate="txtSubject" EnableClientScript="false" ErrorMessage="You must enter a subject." runat="server" />
<asp:RequiredFieldValidator ID="vldMessage" ControlToValidate="txtMessage" EnableClientScript="false" runat="server" ErrorMessage="You must enter a message." />