2011-02-02 13 views
5

En una aplicación Asp.net MVC, he heredado este problema (si es un problema) donde un desarrollador ha usado String para el tipo de fecha.Cómo validar la fecha cuando se usa `String` en lugar de` Date` type?

En mi modelo de la propiedad lee:

requisito
[Required] 
[DisplayName("Registration Date")] 
public string Registrationdate { get; set; } 

El negocio es que el campo es no necesario, pero si hay algo en que los campos entonces debe ser una fecha válida.

¿Cómo implementaría este requisito, sin cambiar el tipo de datos?

+1

probablemente haría algo en la línea de la implementación de un control con DateTime.TryParse en el método de selección – Rob

Respuesta

8

It looks like you're usando System.ComponentModel.DataAnnotations. La mejor forma de hacerlo utilizando esta biblioteca sería crear un nuevo atributo para validar cadenas de fechas y aplicarlo a la propiedad. Aquí hay un código para que pueda empezar con:

[AttributeUsage(AttributeTargets.Property, Inherited = true)] 
class DateAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var dateString = value as string; 
     if (string.IsNullOrWhiteSpace(dateString)) 
     { 
      return true; // Not our problem 
     } 
     DateTime result; 
     var success = DateTime.TryParse(dateString, out result); 
     return success; 
    } 

Es probable que desea ampliar en el código dependiendo de qué tipo de cuerdas que está esperando desde el cliente. Además, esto no le dará ninguna validación del lado del cliente.

+0

+1 para el enlace "Parece que estás", hecho mi día – Rob

+0

+1: tienes toda la razón de que estoy usando DataAnnotations y esperaba algo similar a este tipo de solución. Voy a probar esto esta noche. – VoodooChild

+0

funcionó como un encanto, ¡gracias! – VoodooChild

7
public string Registrationdate { 
    get; 
    set { 
     DateTime date; 
     var isDate = DateTime.TryParse(value, out date); 
     if (isDate) { 
      _registrationDate = value; 
     } 
     else { 
      // Throw exception 
     } 
    } 
} 
+0

gracias Ok, esto no es un mal enfoque. ¿Pero cómo muestro esto como un error de validación en una aplicación MVC? +1 – VoodooChild

1

(tipo de) pseudocódigo:

if (Registrationdate is not empty) 
{ 
    RegistrationDateTime = new DateTime(Registrationdate); 

    if (RegistrationDateTime is not valid DateTime) 
     fail validation; 
} 
0

¿Qué tal una expresión regular? Anotaciones de datos tiene un atributo de expresión regular. Ahora tendría que arreglar un formato, digamos ISO (aaaa/mm/dd) que puede no cumplir con sus requisitos.

Otra alternativa puede ser crear su propia anotación.

Sin embargo, otra solución podría utilizar un datetime nullable (DateTime?). Sin embargo, no estoy seguro de cómo se manejaría eso, por lo que se necesitarían algunas pruebas y errores. Sin embargo, ¿solo necesita la adición de uno? así que podría ser relativamente fácil de probar.

Simon

Cuestiones relacionadas