Дата начала NHiberate Validator до даты окончания - PullRequest
2 голосов
/ 16 мая 2011

Используя Nhibernate Validator (с S # harp Architecture / MVC3), как я могу написать собственный атрибут, предпочтительно не специфичный для объекта (так как это довольно распространенное требование), который предписывает, что PropertyA> = PropertyB (или в болееобщий случай, оба могут быть нулевыми).

Что-то вроде

public DateTime? StartDate { get; set; }

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

Я вижу, что могу переопределить IsValid в конкретном классе Entity, но я не был уверен, что это лучший подход, и я не сталне вижу, как предоставить сообщение в этом случае.

Ответы [ 2 ]

0 голосов
/ 10 марта 2012

В настоящее время, если мне нужно сделать это на модели, у меня есть модель, реализующая 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;
    }

Это, кажется, обеспечивает хорошую интеграцию с существующей системой. Недостаток заключается в том, что, поскольку это не применяется к объекту домена, вам необходима дополнительная логика (или на уровне сервисов, который создает объекты домена и т. Д.), Чтобы применять его также и с этой стороны, если другая модель используется в другом месте. создавать или обновлять доменные объекты.

0 голосов
/ 18 мая 2011

Когда вам нужно сравнить несколько свойств объекта как часть проверки, вам нужен валидатор 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

}

}

...