クラス全体の xVal、DataAnnotations
-
20-09-2019 - |
質問
オブジェクトを完全に検証しており、それを処理する最適な方法を見つけようとしています。
次のクラスがあるとします。
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();
この完全に動作するデモ プロジェクトの詳細については、これをお読みください。 クライアント側の検証に関するブログ記事.
所属していません StackOverflow