2010-08-31 15 views
12

Me ocuparé de escribir una clase de validación de fecha personalizada mañana para una aplicación de reunión en la que estoy trabajando que validará si una fecha de inicio o fin determinada es A) menor que la fecha actual , o B) la fecha de inicio es mayor que la fecha de finalización de la reunión (o viceversa)..NET MVC Custom Date Validator

Creo que este es probablemente un requisito bastante común. ¿Alguien puede indicarme una publicación de blog que pueda ayudarme a resolver este problema?

estoy usando .NET 3.5, así que no puedo utilizar la nueva API modelo validador integrado en .NET 4. El proyecto que estoy trabajando es MVC 2.

ACTUALIZACIÓN: La clase estoy la escritura necesita ampliar el espacio de nombres System.ComponentModel.DataAnnotaciones. En .NET 4 hay una interfaz IValidateObject que puedes implementar, que hace que este tipo de cosas sea un juego de niños absoluto, pero lamentablemente no puedo usar .Net 4. ¿Cómo hago lo mismo en .Net 3.5?

+0

He estado trabajando en él. Tal vez pueda ayudar: [CompareDatesValidator] [1] [1]: http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net-mvc/8070779 # 8070779 – free4ride

+0

Acabo de estar trabajando en eso. Tal vez pueda ayudar: [ENTER Descripción enlace aquí] [1] [1]: http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net- mvc/8070779 # 8070779 – free4ride

Respuesta

21
public sealed class DateStartAttribute : ValidationAttribute 
    {   
     public override bool IsValid(object value) 
     { 
      DateTime dateStart = (DateTime)value; 
      // Meeting must start in the future time. 
      return (dateStart > DateTime.Now); 
     } 
    } 

    public sealed class DateEndAttribute : ValidationAttribute 
    { 
     public string DateStartProperty { get; set; } 
     public override bool IsValid(object value) 
     { 
      // Get Value of the DateStart property 
      string dateStartString = HttpContext.Current.Request[DateStartProperty]; 
      DateTime dateEnd = (DateTime)value; 
      DateTime dateStart = DateTime.Parse(dateStartString); 

      // Meeting start time must be before the end time 
      return dateStart < dateEnd; 
     } 
    } 

y en su vista del modelo:

[DateStart] 
public DateTime StartDate{ get; set; } 

[DateEnd(DateStartProperty="StartDate")] 
public DateTime EndDate{ get; set; } 

En su acción, simplemente comprobar que ModelState.IsValid. Que es lo que buscas?

+0

Se ve bastante bien, no puedo probarlo en este momento, pero podré hacerlo para el final del día. ¡Gracias! – MrBliz

+0

En este caso, ¿cómo recojo los valores para StartDate y EndDate del modelo, ya que ambos son valores ingresados ​​por el usuario? – MrBliz

+0

Cambié mi respuesta. :) Así que StartDate comprueba con DateTime.Now. EndDate comprueba con StartDate que el usuario ingresó para asegurarse de que sea posterior a la fecha de inicio. –

1

creo que esto debería hacerlo:

public boolean MeetingIsValid(DateTime start, DateTime end) 
{ 
     if(start < DateTime.Now || end < DateTime.Now) 
      return false; 

     return start > end || end < start; 
} 
+0

Hola gracias, después de leer tu respuesta, me di cuenta de que necesitaba proporcionar mi información. Por supuesto, el código que ha proporcionado validará una fecha, pero no fue esa parte del problema en el que me quedé. Necesitaba saber qué interfaces implementar para ampliar el espacio de nombres de dataannotes. Gracias de cualquier manera. – MrBliz

4

Sé que esta publicación es anterior, pero encontré que esta solución es mucho mejor.

La solución aceptada en esta publicación no funcionará si el objeto tiene un prefijo cuando es parte de un modelo de vista.

es decir, las líneas

// Get Value of the DateStart property 
string dateStartString = HttpContext.Current.Request[DateStartProperty]; 

una mejor solución se puede encontrar aquí: http://www.a2zdotnet.com/View.aspx?Id=182

+0

Definitivamente una mejor solución! +1 para el enlace útil – DanO

+0

vínculo roto ... :-( – nashwan