2013-11-27 77 views
0

說我有類是這樣的:有沒有辦法讓FluentValidation停止處理其他規則,而無需爲所有規則設置CascadeMode?

public class ParentClass 
{ 
    public ChildClass Child { get; set; } 
    public DateTime Date { get; set; } 
} 
public class ChildClass 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

和驗證程序是這樣的:

public class ParentClassValidator : AbstractValidator<ParentClass> 
{ 
    public ParentClassValidator() 
    { 
     RuleFor(x => x.Child).NotNull(); 
     RuleFor(x => x.Date).Must((parent, date) => 
      date < parent.Child.EndDate && date > parent.Child.StartDate); 
     // ...other rules. 
    } 
} 

是否可以告訴FluentValidation停止檢查規則,如果第一個失敗(如兒童爲null) ,但運行所有其他規則,無論失敗如果通過?

即我真的希望是這樣的:

public ParentClassValidator() 
{ 
    RuleFor(x => x.Child).NotNull().StopOnFailure(); 
    RuleFor(x => x.Date).Must((parent, date) => date < parent.Child.EndDate && date > parent.Child.StartDate); 
    // ...other rules. 
} 

我知道我可以設置CascadeMode = CascadeMode.StopOnFirstFailure,但將盡一切規則失敗終止檢查。說實話,在這種情況下,我只是想保存FluentValidation拋出一個異常,因爲它試圖訪問它已經知道爲null的parent.Child!

+1

對於本示例,您應該可以使用[When](http://fluentvalidation.codeplex.com/wikipage?title=Customising&referringTitle=Documentation&ANCHOR#WhenUnless),但它需要重複驗證和驗證之間的非空檢查謂詞的時候。 –

+0

Bleh。這不像是一個很乾淨的做法:(我懷疑這是唯一的方法,雖然。 – adhocgeek

+0

我懷疑這也是:見http://fluentvalidation.codeplex.com/discussions/352581 –

回答

0

A(不是很好的方式)來實現你想要的是使用一個非空構造函數

public class ParentClassValidator : AbstractValidator<ParentClass> 
{ 
    public ParentClassValidator(bool childIsNotNull) 
    { 
     RuleFor(x => x.Child).NotNull(); 

    if (childIsNotNull) { 
     RuleFor(x => x.Date).Must((parent, date) => 
      date < parent.Child.EndDate && date > parent.Child.StartDate); 
     // ...other rules. 
    } 
} 

}

,那麼你可以使用這種方式:

new ParentClassValidator(model.Child != null).ValidateAndThrow() 

但是這取決於你如何使用你的驗證器......「自動」調用(帶有屬性)是不可能的,你將不得不手動調用ValidateAndThrow,並以某種方式破壞我們驗證者的年齡。

相關問題