2

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

就像是

public DateTime? StartDate { get; set; }

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

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

4

2 回答 2

0

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

我不认为有一个现有的可以做你想做的事,但是编写你自己的很容易。

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

[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

}

}

于 2011-05-17T20:53:13.663 回答
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;
    }

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

于 2012-03-09T20:36:44.847 回答