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

這似乎提供了與現有系統良好的集成。缺點是,由於這不適用於域對象,因此您需要額外的邏輯(或者在創建域對象的服務層等)來強制執行它,以防在其他地方使用不同的模型創建或更新域對象。