質問

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

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

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 クラスのインスタンスであることを期待していますが、検証ランナーで呼び出されません。

誰かこれに対処する方法を知っていますか?

ありがとう、

ハル

役に立ちましたか?

解決

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

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

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();

この完全に動作するデモ プロジェクトの詳細については、これをお読みください。 クライアント側の検証に関するブログ記事.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top