Customise error message on asp.net range validator - c#

Hi is it possible to change the error message of a asp.net range validator based on the value of the textbox. For example if the number is below 0, display the error message, "number can not be less than 0" and if it is above the max value set the error message to "number can't be above maxvalue".
if (stockCount < Convert.ToInt32(range.MinimumValue))
{
range.ErrorMessage = "Quantity has to be minumm of 1";
}
else if (stockCount > Convert.ToInt32(range.MaximumValue))
{
range.ErrorMessage = "Not enough items in stock";
}
this is the code which i have had no success with, any suggestions or advice is more than appreciated.

You can use a simple jQuery listener on the TextBox and change the error message based on it's input.
<script type="text/javascript">
$('#<%= TextBox1.ClientID %>').keyup(function () {
var validator = document.getElementById('<%= RangeValidator1.ClientID %>');
var errorMsg = 'Your value of ' + $(this).val() + ' is incorrect (max is ' + validator.maximumvalue + ')';
$('#<%= RangeValidator1.ClientID %>').text(errorMsg);
});
</script>

If you want in ASP.NET and C# only try below way of doing:
Declare a rangevalidator for your text box
<asp:TextBox id="text1" runat="server"></asp:TextBox><br />
<asp:RangeValidator EnableClientScript="false"
id="RangeValidator1"
runat="server"
ControlToValidate="text1" >
</asp:RangeValidator>
You have to invoke Validate() function of RangeValidator.
And in your code, try below pseudo code where ever you want to validate. (Not tested)
RangeValidator1.MinimumValue = 0;
RangeValidator1.MaximumValue = 10;
RangeValidator1.Type = ValidationDataType.Integer;
RangeValidator1.Validate();
if (!RangeValidator1.IsValid)
{
if(Convert.ToInt32(text1.Text) < 0)
{
RangeValidator1.ErrorMessage = "number can not be less than 0";
}
else
{
RangeValidator1.ErrorMessage = "number can't be above maxvalue";
}
}

Maybe my answer didn't show two different messages, but i think it simpler and cleaner to summarized the message in one error message.
you can use Class and put Range validator with error message on top.
I am very sorry if my suggestion is not to your liking.
public class Example
{
[Range(10, 1000, ErrorMessage = "Value must be between {1} and {2}.")]
public int Quantity { get; set; }
....
}

Related

Javascript Confirmation On if..else.. condition

I have to show confirmation dialogue on particular condition.And then proceed according to YES or No clicked.I tried with the following.
In aspx:
<script type="text/javascript">
function ShowConfirmation() {
if (confirm("Employee Introduced already.Continue?") == true) {
document.getElementById("hdn_empname").value = 1;
}
}
</script>
<asp:HiddenField ID="hdn_empname" runat="server" />
in cs:
if (reader2.HasRows)
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "showAl", "ShowConfirmation();", true);
}
else
{
hdn_empname.Value ="1";
}
if ((hdn_empname.Value)=="1")
{
//some code to execute
}
But hdn_empname shows value="" while debuging.
Can anyone help me doing this?
Thanks in advance.
Try it
You need to ClientID
document.getElementById('<%=hdn_empname.ClientID%>').value = 1;
I found out your main problems
The hidden field values will assign after the if condition call.
Edit :
So, You need to call your logic's in javascript side using ajax
if (confirm("Employee Introduced already.Continue?") == true) {
//some code to execute
}
Where is your break point? If reader2.HasRows returns true your javascript will be registered. But it set the value on client and you get the result after postback.
hdn_empname is server controls Id which is different from client sided id, to get client sided id you need to use ClientID
try this:
document.getElementById('<%=hdn_empname.ClientID%>').value = "1";
You dont need to compare
if (confirm("Employee Introduced already.Continue?") == true)
this will work:
if (confirm("Employee Introduced already.Continue?"))

Get ValidationSummary Error Text from Code Behind

and thank you for reading this!
I may be looking right past the answer for this, or it may be that it was never designed to happen since ValidationSummary is client-side logic, but is there any way to retrieve the error text of a validation summary field in ASP.NET from the C# code-behind? The goal here is to construct a message that includes various information entered by the user, plus any errors that might be preventing that user from completing an operation.
It's fine if it can't be done since I am not expecting client side validation to be much of an issue for users in this program, but it would be nice to include for the sake of completion. Any advice would be appreciated.
Thank you!
Your trouble is probably that these often validate on the client side and not the server side, if they don't actually cause postback. You may be best trying to switch to a CustomValidator and do your checks there.
These happen on the server side and not the client side.
Take a look at the documentation on MSDN http://msdn.microsoft.com/en-us/library/9eee01cx(v=vs.85).aspx
I've never tried this, but here is a quick example of what may work.
Front end
<asp:TextBox id="Text1" runat="server" />
<asp:CustomValidator id="CustomValidator1" runat="server"
OnServerValidate="CustomValidator1_ServerValidate"
Display="Static"
ErrorMessage="My default message."/>
Back End
protected void ServerValidation (object source, ServerValidateEventArgs args)
{
// default to valid
args.IsValid = true;
int i;
if (int.TryParse(Text1.Text.Trim(), out i) == false)
{
// validation failed, flag invalid
args.IsValid = false;
CustomValidator1.ErrorMessage = "The value " + Text1.Text.Trim() + " is not a valid integer";
}
}
protected string GetErrors()
{
string Errors = "";
bool isValidTest = false;
Validate("myValidationGroup");
isValidTest = IsValid;
if (!isValidTest)
{
foreach (BaseValidator ctrl in this.Validators)
{
if (!ctrl.IsValid && ctrl.ValidationGroup == "myValidationGroup")
{
Errors += ctrl.ErrorMessage + "\n";
}
}
}
return Errors.Trim();
}

Open a new window/tab

I am working on a donations website. In my page, I have a textbox which accepts a numeric value from the user (that is, money to be donated).
In my code-behind, I have a method which checks whether the value in the textbox is numeric. The method generates an error message if the number is invalid.
I also have a JavaScript which, after checking that the value in the textbox is numeric, opens a new tab to the website confirmation page, thanking the user for his donation. Here is the code of the javascript:
<script type="text/javascript">
function Open_Window()
{
var textbox = document.getElementById('DonationTextBox');
if (textbox.value != "")
{
if (isNan(textbox) == false)
{
window.open("DonationConfirmation.aspx")
}
}
}
</script>
The problem is that the tab is NEVER opened, even if the number is valid. Can you please help me solve this problem? Thank you.
P.S.
Here is the code of the button that initiates the validation:
<asp:ImageButton ID="PayPalButton2" runat="server" ImageAlign="Middle"
ImageUrl="Resources/Icons/PayPalCheckOut.gif"
onclick="PayPalButton2_Click" OnClientClick="Open_Window()"/>
The function name is isNaN. Note: The final 'N' is capital. That should solve your problem.
<script type="text/javascript">
function Open_Window()
{
var textbox = document.getElementById('<%=DonationTextBox.ClientID%>');
if (textbox.value != "" && !isNaN(textbox.value)) {
window.open("DonationConfirmation.aspx");
}
}
</script>
edit
instead of isNan should be isNaN (javascript is casesensitive)
Shouldn't this line...
if (isNan(textbox) == false)
be this instead...
if (isNan(textbox.value) == false)
First, I would recommend explicitly parsing the number, not relying on the implicit ToNumber operation that will be applied when you pass a string into isNaN. Presumably your users are inputting decimal, so if it's meant to be a whole number (e.g., 10), use:
var num = parseInt(textbox.value, 10);
If it's meant to be a number with a fractional component (e.g., 10.5), use:
var num = parseFloat(textbox.value);
You probably want parseFloat for a currency value.
Then your if condition becomes isNaN (note that the final N is capped) on num:
<script type="text/javascript">
function Open_Window()
{
var textbox = document.getElementById('DonationTextBox');
var num = parseInt(textbox.value, 10);
if (!isNaN(num))
{
window.open("DonationConfirmation.aspx")
}
}
</script>
And lastly, are you sure that the client-side ID of the textbox really is 'DonationTextBox'? ASP auto-generates client-side IDs, you may need to use ClientID instead, e.g.:
var textbox = document.getElementById('<%=DonationTextBox.ClientID%>');
Here is a stripped down working jsFiddle example:
http://jsfiddle.net/pjgalbraith/QZeSF/
The html:
Open
<textarea id="donationTextBox">1</textarea>​
And the js:
function openWindow() {
if($('#donationTextBox').val() && isNaN($('#donationTextBox').val()) === false)
window.open("http://www.google.com/", "mywindow");
}
$(document).ready(function() {
$('#PayPalButton2').click(function(){
openWindow();
});
});
​

JavaScript document.write Chrome

I've got a simple spam killer I'm trying to put together, but the text is not showing up on my form.
The javascript is:
<script language="javascript" type="text/javascript">
document.write("SPAM Killer: What is " + GetDateMonth() + " + " + GetDateDay() + "?")
</script>
In my .js file, I have these two functions defined:
function GetDateMonth() {
return date1.getMonth() + 1;
}
function GetDateDay() {
return date1.getDay() + 1;
}
The text shows up under IE8, but not under Chrome.
As a bonus: My OnClick method of my Submit form has this bit of code that is incorrectly adding my month and date:
string spamError = "The SPAM Killer answer was incorrect. ";
char[] split = spamTest.ToCharArray();
for (int i = 0; i < split.Length; i++) {
if (char.IsLetter(split[i])) {
Ok = false;
txtMessage.Text = spamError + "Non-numeric data entered.";
return;
}
}
int nTestValue = Convert.ToInt32(spamTest, 10);
if (nTestValue < 1) {
Ok = false;
txtMessage.Text = spamError + "Negatave or zero value found.";
}
DateTime dt = DateTime.Now;
int month = dt.Month;
int day = dt.Day;
int nCorrect = month + day;
if (nCorrect != nTestValue) {
Ok = false;
txtMessage.Text = spamError + string.Format("Expected {0}; Received {1}.", nCorrect, nTestValue);
return;
}
Using IE8, I see the following:
SPAM Killer: What is 2 + 3?
I enter 5, click Send, and get Expected 17; Received 5.
Don't reinvent the wheel, help read books with http://www.google.com/recaptcha
For C# code see http://code.google.com/apis/recaptcha/docs/aspnet.html
If you're adamant on sticking with your code, think about the problems around midnight, and users in other timezones. Also, a bot can very easily answer your anti-bot question, it would take me 45 seconds to code support for that, if I wrote bots.
If you're still adamant, you shouldn't use document.write anymore (not since 2002), but instead use DOM to insert the text to a tag ID like this: Change label text using Javascript
The answer, it seems, was in using the document.write() function with appending strings.
I redesigned my HTML to be more like this:
<table>
<tr>
<td colspan="2">
<b>[Human Check]</b><br />
Enter the text to the left and below exactly as it appears:
</td>
</tr>
<tr>
<td>
<script language="javascript" type="text/javascript">
document.write(GetSpamText())
</script>
</td>
</tr>
</table>
#serverfault: Thanks for your suggestion about the date property, though. That would have been a problem.
The text returned by GetSpamText() can be static or coded to create a random value (another topic).

display time in a textbox and modify with up down arrows

I want to display time in textbox or in something like a numericupdownextender used in AJAX so that the user can change time as he desires..
i have used the control to show numbers and increase accordingly..
is there a way to do this..
new code but not what is desired...
<asp:TextBox runat="server" ID="txtHour"></asp:TextBox>
<ajaxToolkit:NumericUpDownExtender ID="txtHour_NumericUpDownExtender" runat="server" Enabled="True" Maximum="12" Minimum="1" TargetControlID="txtHour" Width="70"></ajaxToolkit:NumericUpDownExtender>
<asp:TextBox runat="server" ID="txtMinute"></asp:TextBox>
<ajaxToolkit:NumericUpDownExtender ID="txtMinute_NumericUpDownExtender" runat="server" Enabled="True" Maximum="60" Minimum="1" TargetControlID="txtMinute" Width="70"></ajaxToolkit:NumericUpDownExtender>
<asp:TextBox runat="server" ID="txtDayPart"></asp:TextBox>
<ajaxToolkit:NumericUpDownExtender ID="txtDayPart_NumericUpDownExtender" runat="server" Enabled="True" RefValues="AM;PM" TargetControlID="txtDayPart" Width="70"></ajaxToolkit:NumericUpDownExtender>
the code behind is:
private void ParseTime(string TimeString)
{
// Validation of input
if (TimeString.IndexOf(":") == -1)
{
return;
}
if ((TimeString.IndexOf("PM") == -1) && (TimeString.IndexOf("AM") == -1))
{
return;
}
// Good to go with format
int ColonPos = TimeString.IndexOf(":");
int AMPos = TimeString.IndexOf("AM");
int PMPos = TimeString.IndexOf("PM");
string sHour = TimeString.Substring(0, ColonPos);
string sMinutes = TimeString.Substring(ColonPos, 3); string sDayPart = (TimeString.IndexOf("AM") != -1) ? TimeString.Substring(AMPos, 2) : TimeString.Substring(PMPos, 2);
txtHour.Text = sHour;
txtMinute.Text = sMinutes;
txtDayPart.Text = sDayPart;
}
Yes this should be pretty simple to achieve using the updownextender. Just attach web service methods to the serviceupmethod and servicedownmethod which increment/decrement your datetime by the required timespan. you haven't posted any code so it's difficult to know where you are stuck.
UPDATE: ok, so having thought about this, I don't think there is any real reason to use an updownextender with server call backs. A quick google discovered that javascript already has some basic date manipulation functions, so it's easy enough to do everything client side.
I'm not a javascript expert, so the following code is possibly of questionable quality, but it seems to work ok and hopefully will get you set on the right track. Let me know if you still get stuck.
<head runat="server">
<title></title>
<script type="text/javascript" language="javascript">
<!--
var date;
function initDateObject()
{
date = new Date ( "January 1, 2000 12:00:00" );
showTimePortion();
}
function showTimePortion()
{
document.getElementById('timeDisplay').value = padToMinimumLength(date.getHours(),2) + ':' + padToMinimumLength(date.getMinutes(),2) + ':' + padToMinimumLength(date.getSeconds(),2);
}
function padToMinimumLength(number, requiredLength)
{
var pads = requiredLength - (number + '').length;
while (pads > 0)
{
number = '0' + number;
pads--;
}
return number;
}
function addMinutes(n)
{
date.setMinutes(date.getMinutes() + n);
showTimePortion();
}
function setTodaysTime()
{
var d = new Date();
d.setHours(date.getHours());
d.setMinutes(date.getMinutes());
d.setSeconds(date.getSeconds());
alert('the time is now ' + d.toString());
}
-->
</script>
</head>
<body onload="initDateObject();">
<form id="form1" runat="server">
<div>
<input type="text" id="timeDisplay" readonly="readonly"/>
+
-
<br />
Submit
</div>
</form>
</body>
Hrmm, I recommend you spend some time playing around with jQuery if you haven't. Hope it helps.
jQuery UI
John Resig
lovemore-world has a good article that hopefuly can inspire you and get the creative juices going.

Categories

Resources