Вопрос

Использование NHIBERNATE Validator (с помощью S # Harp Architecty / MVC3), как я могу написать пользовательский атрибут, предпочтительно, не имеющий объекта (поскольку это является довольно распространенным требованием), что обеспечивает то, что HONAGEA>= PropertyB (или болееОбщий случай, оба могут быть нулевым).

что-то вроде

public DateTime? StartDate { get; set; }

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

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

Это было полезно?

Решение

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

}
.

}

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top