2009-06-02 13 views
64

Próbuję użyć programu ASP.NET RangeValidator do sprawdzania poprawności daty w polu tekstowym. Format daty wprowadzonej w polu tekstowym to dd MMMM yyyy.Walidacja dat z walidatorem ASP.NET

Jak mogę użyć walidatora zasięgu do sprawdzenia poprawnej daty? Jeśli wprowadzę 1 stycznia 1000 jako wartość min lub max, otrzymam komunikat, że wartości nie można przekonwertować na datę typu, ale jeśli użyję innego formatu, to mój wprowadzony tekst będzie nieprawidłowy.

Poniżej jest mój kod:

<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> 
+0

Czy próbujesz zweryfikować format? ponieważ nie rozumiem twojego problemu? – TStamper

Odpowiedz

126

Najlepszym rozwiązaniem byłoby

Dodaj porównać walidator do formularza internetowego. Ustaw jego controlToValidate. Ustaw właściwość Typ na Data. Ustaw jego właściwość operatora na DataTypeCheck, np .:

<asp:CompareValidator 
    id="dateValidator" runat="server" 
    Type="Date" 
    Operator="DataTypeCheck" 
    ControlToValidate="txtDatecompleted" 
    ErrorMessage="Please enter a valid date."> 
</asp:CompareValidator> 
+3

Prosty i elegancki. Dodatkowo wbudowane elementy sterujące sprawdzają także ważne/nieważne daty roku przestępnego. 2/29/2011 jest nieprawidłowy, ale 2/29/2012 wraca ważny. Nie musisz się już martwić wymyślnymi wyrażeń regularnych! –

+6

@Shoban - A jeśli mój format daty to "DD/MM/YYYY"? –

+1

@Ryan Sammut Chciałbym również znać odpowiedź na to pytanie. Typ Date CompareValidator akceptuje MM/DD/RR. Chcę wykluczyć 2-cyfrową wartość roku. – danyim

2

Uważam, że daty muszą być określone w aktualnej kulturze wniosku. Możesz poeksperymentować z ustawieniem wartości CultureInvariantValues na true i sprawdzić, czy to rozwiąże problem. W przeciwnym razie może być konieczna zmiana DateTimeFormat dla aktualnej kultury (lub samej culture), aby uzyskać to, co chcesz.

24

CustomValidator będzie również pracować tutaj:

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

Code-tył:

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); 
} 
+0

Próbowałem Twojej metody, ale nie powiodło się w panelu aktualizacji. Pls chk: http://stackoverflow.com/questions/2071585/asp-net-custom-validation-not-working-even-when-required-field-validator-is-use/14361135#14361135 –

+1

To był najlepszy sposób dla mnie najłatwiejszy i mam całkowitą kontrolę nad tym, co zostało sprawdzone i wykonane w kodzie za. Thnx dużo Chris !! – user1501127

+1

Działa to dobrze dla edycji zakresu dat SQL dla starszych systemów, które również używają pól datetime. Dzięki. –

7

Myślę, że po to najprostszy sposób, aby to zrobić.

<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>