4

オブジェクトの完全な検証があり、それを処理する最善の方法を見つけようとしています。

次のクラスがあるとします。

public class LetterResponse {
 public Guid Id {get;set;}
 public bool SendBlankCart {get;set;}
 public string ToName {get;set;}
 public string ToAddress {get;set;}
}

クラスを永続化する前にクラスを検証するために dataannotation と xval を使用したいのですが、複数のプロパティを必要とする複雑な検証があります。

擬似:

if SendBlankCart {
 - no validation on ToName, ToAddress 
} else {
 ToName - required.
 ToAddress - required. 
}

次のように注釈を付けたいと思います。

[LetterResponseValidator]
public class LetterResponse {
 public Guid Id {get;set;}
 public bool SendBlankCart {get;set;}
 public string ToName {get;set;}
 public string ToAddress {get;set;}
}

次のような検証ルールがあります。

public class LetterResponseValidator : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            if (value.GetType() == typeof(LetterResponse))
            {
                var letterResponse = (letterResponse) value;
                if (letterResponse.SendBlankCard)
                {
                    return true;
                } else
                {
                    if (string.IsNullOrEmpty(letterResponse.FromDisplayName) || string.IsNullOrEmpty(letterResponse.ToAddress1))
                    {
                        return false;
                    }
                    return true;
                }

            }
            return false;
        }
    }

パラメータが LetterResponse クラスのインスタンスであることを期待していますが、検証ランナーで呼び出されませんか?

これを処理する方法を知っている人はいますか?

ありがとう、

ハル

4

1 に答える 1

3

これは、クラスレベルのバリデーターがあるという事実とは関係ないと思います。接続を除外するには、ダミーの必須バリデーターを「ToName」に適用して、バリデーターが呼び出されるかどうかを確認してください。

呼び出されている場合はお知らせください。そうでない場合は、Global.asax.cs ファイルの DataAnnotationsModelBinder で標準のモデル バインダーをオーバーライドしているかどうかを確認する必要があります。

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();

この完全に機能するデモ プロジェクトの詳細については、クライアント側の検証に関するこのブログ記事を参照してください。

于 2009-08-28T16:56:48.307 に答える