2

如何使用Nhibernate验证器(使用S#harp Architecture/MVC3),如何编写自定义属性,最好不是对象特定的(因为这是一个相当常见的要求),该属性强制执行PropertyA> = PropertyB(或者在更一般的情况下,两者都可以为null)。NHiberate Validator开始日期结束日期

喜欢的东西

public DateTime? StartDate { get; set; } 

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

我看到,我可以覆盖特别EntityIsValid,但我不知道这是否是最好的方法,我没有看到如何在提供消息那种情况。

+0

我认为通过流畅的样式映射可能会更容易完成此操作。你应该看看这些文章[这里](http://fabiomaulo.blogspot.com/search/label/Validator)。 – 2011-05-17 11:54:35

回答

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 

} 

}

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; 
    } 

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

相关问题