2009-06-02 27 views
64

Estoy tratando de usar un ASP.NET RangeValidator para validar una fecha en un cuadro de texto. El formato de la fecha ingresada en el cuadro de texto es dd MMMM yyyy.Fecha de validación con el validador de ASP.NET

¿Cómo puedo usar el validador de rango para validar una fecha válida? Si ingreso 1 de enero de 1000 como el valor mínimo o máximo, aparece un error que dice que el valor no se puede convertir a tipo fecha, pero si utilizo otro formato, el texto ingresado no es válido.

A continuación es mi código:

<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

¿Está intentando validar el formato? porque no estoy entendiendo tu problema? – TStamper

Respuesta

126

mejor opción sería

Añadir un validador para comparar el formulario web. Establezca su control para validar. Establezca su propiedad Type en Date. Establezca su propiedad operador DataTypeCheck por ejemplo:

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

Simple y elegante. Además, los controles integrados también verifican las fechas válidas/inválidas del año bisiesto. 29/02/2011 dice inválido pero 2/29/2012 vuelve válido. ¡No hay necesidad de molestar con expresiones regulares de lujo! –

+6

@Shoban - ¿Qué tal si mi formato de fecha es 'DD/MM/YYYY'? –

+1

@Ryan Sammut También quiero saber la respuesta a esta pregunta. El tipo de fecha CompareValidator acepta MM/DD/YY. Quiero excluir el valor del año de 2 dígitos. – danyim

2

creo que las fechas tienen que ser especificados en la cultura actual de la aplicación. Es posible que desee experimentar con la configuración de CultureInvariantValues en true y ver si eso resuelve su problema. De lo contrario, es posible que necesite cambiar el DateTimeFormat para la cultura actual (o el culture mismo) para obtener lo que desea.

24

Un CustomValidator también trabajaría aquí:

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

de código subyacente:

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

Intenté su método pero falló en un panel de actualización. Pls chk: http://stackoverflow.com/questions/2071585/asp-net-custom-validation-not-working-even-when-required-field-validator-is-use/14361135#14361135 –

+1

Esta fue la mejor manera para mí, es más fácil y tengo control total sobre lo que está marcado y hecho en el código subyacente. ¡Por fin, Chris! – user1501127

+1

Esto funciona bien para las ediciones de rango de fechas de SQL para sistemas heredados que también usan los campos de fecha y hora. Gracias. –

7

Creo que la siguiente es la forma más fácil de hacerlo.

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