web-dev-qa-db-fra.com

Validation de la date avec le validateur ASP.NET

J'essaie d'utiliser un ASP.NET RangeValidator pour valider une date dans une zone de texte. Le format de la date saisie dans la zone de texte est dd MMMM yyyy.

Comment puis-je utiliser le validateur de plage pour valider une date valide? Si j'entre 1er janvier 10 comme valeur minimale ou maximale, le message d'erreur indiquant que la valeur peut être convertie en type date est erroné, mais si j'utilise un autre format, le texte saisi est invalide.

Ci-dessous mon 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>
65
Nicholas

La meilleure option serait

Ajoutez un validateur de comparaison au formulaire Web. Définissez son controlToValidate. Définissez sa propriété Type sur Date. Définissez sa propriété d'opérateur sur DataTypeCheck, par exemple:

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

Un CustomValidator fonctionnerait également ici:

<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);
}
28
Chris Van Opstal

Je pense que ce qui suit est la meilleure façon de le faire.

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

Je crois que les dates doivent être spécifiées dans la culture actuelle de l'application. Vous voudrez peut-être expérimenter avec le paramètre CultureInvariantValues sur true et voir si cela résout votre problème. Sinon, vous devrez peut-être changer le DateTimeFormat pour la culture actuelle (ou le culture elle-même) pour obtenir ce que vous voulez.

2
tvanfosson