質問

Nhibernate Validatorを使用する(S#HARPアーキテクチャ/ MVC3を使用する)、カスタム属性を書くことができます(これはかなり一般的な要件ではありません)Propertya>= PropertyB(またはより多くの場合は、一般的なケース、両方ともNULLです。

のようなもの

public DateTime? StartDate { get; set; }

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

特定のIsValidクラスでEntityをオーバーライドできることがわかりますが、それが最良のアプローチであるかどうかはわかりませんでした。その場合はメッセージを提供する方法はわかりませんでした。

役に立ちましたか?

解決

検証の一部としてオブジェクトの複数のプロパティを比較する必要がある場合は、Claass Validatorが必要です。その後、属性はプロパティではなくクラスに適用されます。

あなたが望むものをするための既存のものがあるとは思わないが、あなた自身のことを書くのに十分な容易であるとは思わない。

これはあなたのバリデータがのように見えるものをおおよそ見るためのコードの概要です。

[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

}
.

}

他のヒント

現在、モデルでこれを行う必要がある場合は、モデルを実装しています。

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