NHiberate Validator fecha de inicio antes de la fecha de finalización

Usando Nhibernate Validator (con S # harp Architecture / MVC3), ¿cómo puedo escribir un atributo personalizado, preferiblemente no específico del objeto (ya que este es un requisito bastante común) que refuerza que PropertyA> = PropertyB (o en el caso más general, ambos pueden ser nulos).

Algo como

public DateTime? StartDate { get; set; }

[GreaterThanOrEqual("StartDate")]
public DateTime? EndDate { get; set; }

Veo que puedo anular IsValid en el particular Entity class pero no estaba seguro de si ese era el mejor enfoque, y no vi cómo enviar un mensaje en ese caso.

preguntado el 16 de mayo de 11 a las 17:05

Creo que puede ser más fácil lograr esto a través de los mapeos de estilo fluidos. Deberías echar un vistazo a estos artículos. aquí. -

2 Respuestas

Cuando necesita comparar varias propiedades de un objeto como parte de la validación, necesita un validador de claass. Luego, el atributo se aplica a la clase, no a la propiedad.

No creo que exista uno para hacer lo que quieres, pero es bastante fácil escribir el tuyo propio.

Aquí hay un esquema de código para mostrarle aproximadamente cómo podría verse su validador

[AttributeUsage(AttributeTargets.Class)]
[ValidatorClass(typeof(ReferencedByValidator))]
public class GreaterThanOrEqualAttribute : EmbeddedRuleArgsAttribute, IRuleArgs
{        
    public GreaterThanOrEqualAttribute(string firstProperty, string secondProperty)
    {
        /// Set Properties etc
    }
}

public class ReferencedByValidator : IInitializableValidator<GreaterThanOrEqualAttribute>
{       
    #region IInitializableValidator<ReferencedByAttribute> Members

    public void Initialize(GreaterThanOrEqualAttribute parameters)
    {
        this.firstProperty = parameters.FirstProperty;
        this.secondProperty = parameters.SecondProperty;
    }

    #endregion

    #region IValidator Members

    public bool IsValid(object value, IConstraintValidatorContext constraintContext)
    {
       // value is the object you are trying to validate

        // some reflection code goes here to compare the two specified properties
   }
    #endregion

}

}

contestado el 18 de mayo de 11 a las 00:05

Actualmente, si necesito hacer esto en un modelo, tengo el modelo implementado IValidatableObject

public class DateRangeModel : IValidatableObject {

   public DateTime StartDate { get; set; }
   public DateTime EndDate { get; set; }


   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> results = new List<ValidationResult>();
        if (StartDate > EndDate)
        {
            results.Add(new ValidationResult("The Start Date cannot be before the End Date.", "StartDate"));
        }
        return results;
    }

Esto parece proporcionar una buena integración con el sistema existente. El inconveniente es que, dado que esto no se aplica en el objeto de dominio, necesita lógica adicional allí (o en una capa de servicios que crea los objetos de dominio, etc.) para aplicarlo también desde ese extremo, en caso de que se use un modelo diferente en otro lugar. para crear o actualizar los objetos de dominio.

respondido 10 mar '12, 00:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.