1

次のクラスを取得したとしましょう。

public class Post 
{
    public Date BeginDate { get; set; }

    [Validate2Date(BeginDate, EndDate, ErrorMessage = "End date have to occurs after Begin Date")]
    public Date EndDate { get; set; }
}

public class Validate2Dates : ValidationAttribute
{
    public Validate2Dates(DateTime a, DateTime b)
    { ... }

    public override bool IsValid(object value)
    {
        // Compare date and return false if b < a
    }
}

私の問題は、それができないため、カスタム Validate2Dates 属性を使用する方法です。

[Validate2Date(BeginDate, EndDate, ErrorMessage = "End date have to occurs before Begin Date")]

次のエラーが発生しました。

非静的フィールド、メソッド、またはプロパティ '...Post.BeginDate.get' C:...\Post.cs にはオブジェクト参照が必要です

4

2 に答える 2

0

そのような属性を使用することはできません。属性パラメータは定数値に制限されています。

Imo より良い解決策は、このチェックを実装し、好みのビジネス ロジック検証インターフェイスを介して呼び出すことができるメソッドをクラスに提供することです。

于 2010-01-19T06:45:16.703 に答える
0

答えはイエスです。あなたがやろうとしていることはできますが、現在のやり方ではありません。(ちなみに、この質問はすでに非常によく回答されていることに気付いたので、少なくともクイックリファレンスをドロップすると思いました。)

上記のリンクに基づいて...

  1. カスタムバリデータを作成する必要があります(すでに行っています)
  2. プロパティ レベルではなく、クラスレベルでモデルを装飾する必要があります。
  3. プロパティ自体をパラメーターとして使用することはありません。代わりに、リフレクションを介して検索される文字列として参照するだけです。

[Validate2Date(BeginDate, EndDate, ...

になる

[Validate2Date(StartDate = "BeginDate", EndDate = "EndDate", ...

次に IsValid() をオーバーライドし、必要なプロパティを反映して比較を実行します。リンクから

.... 
        var properties = TypeDescriptor.GetProperties(value);
        object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value);
        object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value);
        return Object.Equals(originalValue, confirmValue);
....
于 2010-12-23T16:20:29.807 に答える