NHibernate验证开始日期在结束日期之前

时间:2011-05-16 17:02:10

标签: nhibernate asp.net-mvc-3 s#arp-architecture nhibernate-validator

使用Nhibernate Validator(使用S#harp架构/ MVC3),我如何编写自定义属性,最好不是特定于对象(因为这是一个相当常见的要求),强制执行PropertyA> = PropertyB(或在更一般的情况,两者都可能为空)。

这样的东西
public DateTime? StartDate { get; set; }

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

我看到我可以在特定的IsValid课程中覆盖Entity,但我不确定这是否是最佳方法,在这种情况下我没有看到如何提供消息

2 个答案:

答案 0 :(得分:0)

当您需要比较对象的多个属性作为验证的一部分时,您需要一个claass验证器。然后将该属性应用于类,而不是属性。

我认为没有一个可以做你想做的事情,但写起来很容易。

这是一个代码大纲,大致向您展示验证器的外观

[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

}

}

答案 1 :(得分:0)

目前,如果我需要在模型上执行此操作,我会使用模型实现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;
    }

这似乎提供了与现有系统的良好集成。缺点是,由于这不适用于域对象,因此在那里需要额外的逻辑(或者在创建域对象的服务层中等)以便从该端强制执行它,以防在其他地方使用不同的模型创建或更新域对象。