Saya perlu mengatur urutan eksekusi untuk validasi sehingga berhenti memvalidasi setelah kegagalan pertama.
Namun ini tidak tersedia, jadi saya ingin tahu cara lain apa untuk melakukan ini.
Biasanya saya akan memiliki sesuatu seperti ini:
public Constructor(){
// Simple validation
RuleFor(x => x.Id).NotNull().NotEmpty();
// advanced validation
// item must exist in database
RuleFor(x => x.Id).Must(ExistsInDatabase);
// item must exist in database previously
// item must be some of the allowed names -- fetched from db
RuleFor(x => x.Id).Must(BeAReferenceInSomeTable);
private bool ExistsInDatabase(){}
private bool BeAReferenceInSomeTable(){}
}
Namun dengan ini BeAReferenceInSomeTable dapat dieksekusi sebelum ExistsInDatabase. Jadi validasi BeAReferenceInSomeTable akan memunculkan pengecualian ketika Id tidak ada dalam tabel alih-alih validasi gagal karena validasi ExistsInDatabase.
Untuk mengatasinya pertama yang terlintas dalam pikiran adalah seperti ini:
public Constructor(){
CascadeMode = FluentValidation.CascadeMode.StopOnFirstFailure;
// simple validation stays the same
...
// advanced validation
RuleFor(x => x.Id)
.Must(ExistsInDatabase)
.Must(BeAReferenceInSomeTable)
.When(x => !string.IsNullOrEmpty(x.Id) &&
!string.IsNullOrEmpty(x.Name)
);
}
Namun dalam kasus ini bagaimana cara menetapkan pesan yang tepat untuk validasi karena pesan harus diberikan sebelum dieksekusi.
.WithMessage("your message");
untuk menambahkan pesan yang tepat untuk kegagalan validasi, dan ini juga berfungsi dengan rangkaian (yang Anda lakukan pada contoh kedua). - person Moo   schedule 12.06.2014