web-dev-qa-db-ja.com

FluentValidation-オブジェクトのリストを含むビューモデルの検証

複雑なビューモデルを含むプロジェクトでFluentValidationを試しているところ、- ドキュメントはこちら を読みましたが、ビューモデルで宣言されたオブジェクトのリストを検証するルールを設定する方法がわかりません。以下の私の例では、ビューモデルのリストに1つ以上のGuitarオブジェクトが含まれています。ありがとう

モデルを表示

 [FluentValidation.Attributes.Validator(typeof(CustomerViewModelValidator))]
    public class CustomerViewModel
    {
        [Display(Name = "First Name")]
        public string FirstName { get; set; }

        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [Display(Name = "Phone")]
        public string Phone { get; set; }

        [Display(Name = "Email")]
        public string EmailAddress { get; set; }

        public List<Guitar> Guitars { get; set; } 
    }

ビューモデルで使用されるギタークラス

public class Guitar
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int? ProductionYear { get; set; }
}

View Model Validator Class

 public class CustomerViewModelValidator : AbstractValidator<CustomerViewModel>
    {


        public CustomerViewModelValidator()
        {
            RuleFor(x => x.FirstName).NotNull();
            RuleFor(x => x.LastName).NotNull();
            RuleFor(x => x.Phone).NotNull();
            RuleFor(x => x.EmailAddress).NotNull();
           //Expects an indexed list of Guitars here????


        }
    }
29
Slinky

これをCustomerViewModelValidatorに追加します

RuleFor(x => x.Guitars).SetCollectionValidator(new GuitarValidator());

したがって、CustomerViewModelValidatorは次のようになります。

public class CustomerViewModelValidator : AbstractValidator<CustomerViewModel>
{
    public CustomerViewModelValidator()
    {
        RuleFor(x => x.FirstName).NotNull();
        RuleFor(x => x.LastName).NotNull();
        RuleFor(x => x.Phone).NotNull();
        RuleFor(x => x.EmailAddress).NotNull();
        RuleFor(x => x.Guitars).SetCollectionValidator(new GuitarValidator());
    }
}

GuitarValidatorを追加すると、次のようになります。

public class GuitarValidator : AbstractValidator<Guitar>
{
    public GuitarValidator()
    {
        // All your other validation rules for Guitar. eg.
        RuleFor(x => x.Make).NotNull();
    }
 }
46
Jonathon Choo

このコードは廃止されました:RuleFor(x => x.Guitars).SetCollectionValidator(new GuitarValidator());

これは、新しい:

RuleForEach(x => x.Guitars).SetValidator(new GuitarValidator());

Fluentの最新バージョンで動作し、使用する完全な例が含まれています。

回答のコードは非推奨です。

1
Nico Campisano
RuleForEach(
  itemToValidate => 
     new YourObjectValidator());


public class YourObjectValidator : AbstractValidator<YourObject>
{
  public EdgeAPIAddressValidator()
  {
     RuleFor(r => r.YourProperty)
         .MaximumLenght(100);
  }
}
1
Nico Campisano

Fluentの最新バージョンで動作します。

0
Nico Campisano