2016-09-02 7 views
4

私はモデルクラスがあります。リストに対して直接検証する方法<T>?

public class MyModel() { //properties here... } 

をそして私はMyModelオブジェクトのリストを検証します。だから私はこのバリデーターを作成しました:

class MyModelListValidator : AbstractValidator<List<MyModel>> 
{ 
    public MyModelListValidator() 
    { 
     RuleFor(x => x) 
      .SetCollectionValidator(new MyModelValidator()) 
      .When(x => x != null); 
    } 

    private class MyModelValidator : AbstractValidator<MyModel> 
    { 
     public MyModelValidator() 
     { 
      //MyModel property validation here... 
     } 
    } 
} 

しかし、上記は機能しません。代わりに、次のようなクラスを作成することもできます。

public class MyModelList() 
{ 
    public List<MyModel> Items { get; set; } 
} 

これは機能します。

しかし、この追加のクラスを使用せずにこれを行う方法はありますか?あなたのアクションが入った場合

[EnsureMinimumElements(1, ErrorMessage = "At least a person is required")] 
public List<Person> Persons { get; private set; } 
Personally I use FluentValidation.NET instead of Data Annotations to perform validation because I prefer the imperative validation logic instead of the declarative. I think it is more powerful. So my validation rule would simply look like this: 

RuleFor(x => x.Persons) 
    .Must(x => x.Count > 0) 
    .WithMessage("At least a person is required"); 
+0

:その後、

[EnsureOneElement(ErrorMessage = "At least a person is required")] public List<Person> Persons { get; private set; } or to make it more generic: public class EnsureMinimumElementsAttribute : ValidationAttribute { private readonly int _minElements; public EnsureMinimumElementsAttribute(int minElements) { _minElements = minElements; } public override bool IsValid(object value) { var list = value as IList; if (list != null) { return list.Count >= _minElements; } return false; } } 

と:

public class EnsureOneElementAttribute : ValidationAttribute { public override bool IsValid(object value) { var list = value as IList; if (list != null) { return list.Count > 0; } return false; } } 

、その後: –

答えて

0

はあなたがカスタム属性を必要とするかもしれない検証を実行するために、データ注釈を使用している場合`List `をパラメータとして使用すると、 `AbstractValidator `を定義することができ、fluentvalidation will appリスト内の各項目に自動的に表示されます。
関連する問題