ฉันต้องตั้งค่าลำดับการดำเนินการสำหรับการตรวจสอบเพื่อหยุดการตรวจสอบหลังจากความล้มเหลวครั้งแรก
อย่างไรก็ตาม สิ่งนี้ไม่พร้อมใช้งาน ดังนั้นฉันจึงสงสัยว่ามีวิธีอื่นในการดำเนินการนี้อย่างไร
โดยปกติฉันจะมีสิ่งนี้:
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(){}
}
แต่ด้วย BeAReferenceInSomeTable นี้สามารถดำเนินการได้ก่อน ExistsInDatabase ดังนั้นการตรวจสอบ BeAReferenceInSomeTable จะทำให้เกิดข้อยกเว้นเมื่อไม่มี Id ในตารางแทนที่จะตรวจสอบล้มเหลวเนื่องจากการตรวจสอบ ExistsInDatabase
ในการแก้ไขปัญหานี้ก่อนอื่นที่นึกถึงมีดังนี้:
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)
);
}
แต่ในกรณีนี้ ฉันจะตั้งค่าข้อความที่เหมาะสมเพื่อการตรวจสอบได้อย่างไร เนื่องจากจะต้องได้รับข้อความก่อนดำเนินการ
.WithMessage("your message");
เพื่อเพิ่มข้อความที่เหมาะสมสำหรับการตรวจสอบความถูกต้องที่ล้มเหลว และวิธีนี้ใช้ได้กับการผูกมัดด้วยเช่นกัน (ซึ่งเป็นสิ่งที่คุณกำลังทำในตัวอย่างที่สองของคุณ) - person Moo   schedule 12.06.2014