68

I'm trying to use an ASP.NET RangeValidator to validate a date on a textbox. The format of the date entered on the textbox is dd MMMM yyyy.

How can I use the range validator to validate a valid date? If I enter 1 January 1000 as the min or max value I get an error saying value cannot be converted to type date, but if I use another format it picks up my entered text as invalid.

Below is my code:

<asp:TextBox 
    runat="server" 
    ID="txtDatecompleted" 
/>
<cc2:CalendarExtender
    ID="datecompletedExtender" 
    runat="server"
    TargetControlID="txtDatecompleted"
    Format="dd MMMM yyyy"
/>  
<asp:RangeValidator 
    runat="server" 
    ID="RangeValidator1" 
    Type="Date" 
    ControlToValidate="txtDatecompleted" 
    MaximumValue="9999/12/28" 
    MinimumValue="1000/12/28" 
    ErrorMessage="enter valid date" 
    Display="None"
/>
<cc2:ValidatorCalloutExtender 
    ID="RangeValidator1_ValidatorCalloutExtender" 
    runat="server"
    Enabled="True"
    TargetControlID="RangeValidator1">
</cc2:ValidatorCalloutExtender>
1
  • Are you trying to validate the format? because I'm not understanding your problem? Commented Jun 2, 2009 at 14:20

4 Answers 4

138

Best option would be

Add a compare validator to the web form. Set its controlToValidate. Set its Type property to Date. Set its operator property to DataTypeCheck eg:

<asp:CompareValidator
    id="dateValidator" runat="server" 
    Type="Date"
    Operator="DataTypeCheck"
    ControlToValidate="txtDatecompleted" 
    ErrorMessage="Please enter a valid date.">
</asp:CompareValidator>
Sign up to request clarification or add additional context in comments.

5 Comments

Simple and elegant. Plus the built in controls also check for valid/invalid leap year dates. 2/29/2011 says invalid but 2/29/2012 comes back valid. No need to hassle with fancy regular expressions!
@Ryan Sammut I also want to know the answer to this question. The Date type CompareValidator accepts MM/DD/YY. I want to exclude the 2-digit year value.
Just a note that the CompareValidator is culture dependent, so if you would like another dateformat (e.g. dd-mm-yyyy) just set the culture accordinaly
This works, but the caveat is that this allows dates that may be out of range of SQL dates less than 1753 or you may have a date range (no future date entries). This does work, but Chris Van Opstal's may be needed for SQL date edits.
This won't work for the question asked because of the date format specified as "dd MMMM yyyy". CustomValidator on dates only works if the date is in "dd/mm/yyyy" format (for en-GB) or "mm/dd/yyyy" for (en-US).
27

A CustomValidator would also work here:

<asp:CustomValidator runat="server"
    ID="valDateRange" 
    ControlToValidate="txtDatecompleted"
    onservervalidate="valDateRange_ServerValidate" 
    ErrorMessage="enter valid date" />

Code-behind:

protected void valDateRange_ServerValidate(object source, ServerValidateEventArgs args)
{
    DateTime minDate = DateTime.Parse("1000/12/28");
    DateTime maxDate = DateTime.Parse("9999/12/28");
    DateTime dt;

    args.IsValid = (DateTime.TryParse(args.Value, out dt) 
                    && dt <= maxDate 
                    && dt >= minDate);
}

3 Comments

I tried your method but it failed within an update panel. Pls chk: stackoverflow.com/questions/2071585/…
This was the best way for me, easiest and i have total control over what is checked&done in the code behind. Thnx alot Chris!!
This works good for SQL date range edits for legacy systems that use the datetime fields as well. Thanks.
8

I think the following is the easiest way to do it.

<asp:TextBox ID="DateControl" runat="server" Visible="False"></asp:TextBox>
<asp:RangeValidator ID ="rvDate" runat ="server" ControlToValidate="DateControl" ErrorMessage="Invalid Date" Type="Date" MinimumValue="01/01/1900" MaximumValue="01/01/2100" Display="Dynamic"></asp:RangeValidator>

Comments

2

I believe that the dates have to be specified in the current culture of the application. You might want to experiment with setting CultureInvariantValues to true and see if that solves your problem. Otherwise you may need to change the DateTimeFormat for the current culture (or the culture itself) to get what you want.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.