複雑なビューモデルを含むプロジェクトで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????
}
}
これを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();
}
}
このコードは廃止されました:RuleFor(x => x.Guitars).SetCollectionValidator(new GuitarValidator());
これは、新しい:
RuleForEach(x => x.Guitars).SetValidator(new GuitarValidator());
Fluentの最新バージョンで動作し、使用する完全な例が含まれています。
回答のコードは非推奨です。
RuleForEach(
itemToValidate =>
new YourObjectValidator());
public class YourObjectValidator : AbstractValidator<YourObject>
{
public EdgeAPIAddressValidator()
{
RuleFor(r => r.YourProperty)
.MaximumLenght(100);
}
}
Fluentの最新バージョンで動作します。