DataAnnotations
モデルの検証に使用しています。
モデルの非常に単純化されたバージョンは次のとおりです。
public class Model
{
public List<Thing> Things;
}
public class Thing
{
[Required]
public string Name {get;set;}
}
面白いことにThing
、名前のないを作成してモデルに追加すると、検証は失敗すると予想されますが、合格します(ショックホラー!)。
var model = new Model ();
var invalidThing = new Thing (); // No name would fail validation
model.Things.Add(invalidThing );
var validationContext = new ValidationContext(model);
var validationResults = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(model, validationContext, validationResults, true);
Assert.False (isValid); // This fails!
私が考えるその理由は、あなたがモデルを検証するとき、それはコレクションの場合、それはプロパティに項目を各プロパティを検証ではなく、ということです。Things
は検証されていないプロパティであるため、合格します(無効なアイテムが含まれているにもかかわらず)。
検証によってコレクションプロパティのアイテムも検証されるようにするにはどうすればよいですか?すぐに使用できるバリデーターはありますか?
各アイテムの検証をチェックするコレクションのカスタムバリデーターを作成することで、これを修正しました。簡略化されたコードは次のようになります。
public class ValidateEachItemAttribute : ValidationAttribute
{
protected readonly List<ValidationResult> validationResults = new List<ValidationResult>();
public override bool IsValid(object value)
{
var list = value as IEnumerable;
if (list == null) return true;
var isValid = true;
foreach (var item in list)
{
var validationContext = new ValidationContext(item);
var isItemValid = Validator.TryValidateObject(item, validationContext, validationResults, true);
isValid &= isItemValid;
}
return isValid;
}
// I have ommitted error message formatting
}
このようにモデルを装飾すると、期待どおりに機能します。
public class Model
{
[ValidateEachItem]
public List<Thing> Things;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加