プロパティを持つクラスが与えられ、FooExists
などのカスタムバリデータを記述すると、FooExists
の機能の中で隣接する検証デコレータを表示できます。よりスマートなことがなければ、私は代わりにやっていなければなりません。近接バリデータについて知っているC#クラスプロパティバリデータ
私はさまざまなクラスのプロパティの上にスローするカスタムバリデータを持っています。場合によっては、[Required]
とペアリングします。
が必要でないシナリオでは、をオーバーライドしたIsValid
内で確認して、別の方法で処理したいと考えています。
public class ExampleDTO
{
[Required]
[FooExists]
public string Foo { get; set; }
public string Bar { get; set; }
}
public class AnotherExampleDTO
{
[FooExists]
public string Foo { get; set; }
public bool IsMoo { get; set; }
}
[AttributeUsage(AttributeTargets.Property)]
sealed public class FooExistsAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
// ideally I could check if this property is required via [Required]
// look things up in the database, return true or false
return true;
}
}
すべてこのため、この理由は、私はExampleDTO
を受け、コントローラにPOSTを行う場合、fooが(必須)存在するように検証し、その値は(FooExists)合法であるということであろう、です。しかし、私がAnotherExampleDTO
を受け取るコントローラにPOSTを行い、Fooパラメータを省略した場合(必須ではないため)、私はそれを失敗させたくありません。FooExists
。 FooExistsはnullであるかどうかを確認できますが、実際には「必要でない場合はNULLを返し、true、true」を返します。
私は[FooExists(Required=true)]
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
sealed public class FooExistsAttribute : ValidationAttribute
{
public bool Required { get; set; }
public override bool IsValid(object value)
{
if (!Required && value == null)
return true
// look things up in the database, return true or false
return true;
}
}
しかし、これは間違っていると感じ、言及しないようにできるように、私は自由[Required]
エラーメッセージを失い、自分の必要なプロパティを追加することで周りにおもちゃにしています。
私も自分のDTOにIValidatableObjectを継承したモデルでこれを入れて(この場合)を避けるためにしようとしている:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
// I could check all of the class properties in here
}
FluentValidationをチェックしてください。カスタム属性を扱わなくてもいいかもしれません。 – PmanAce